SpringBoot使用validation-api實現(xiàn)對枚舉類參數(shù)校驗的方法
前言
之前寫了一個博客是關(guān)于使用SpringBoot
使用validation-api
實現(xiàn)參數(shù)校驗,當時使用的注解都是validation-api自帶的注解只能完成對空值、長度等簡單的校驗,在我們?nèi)粘5氖褂卯斨袝龅綄?shù)是否在枚舉值類的校驗,針對這種情況我們怎么來實現(xiàn)呢?
SpringBoot使用validation-api實現(xiàn)參數(shù)校驗可參考我的博客:SpringBoot使用validation-api實現(xiàn)參數(shù)校驗
正文
SpringBoot使用validation-api實現(xiàn)對枚舉類參數(shù)校驗
ValidationApi框架就是用來解決參數(shù)校驗中代碼冗余問題,ValidationApi
框架提供一些注解用來幫助我們對請求參數(shù)進行校驗。
Maven依賴
<!--參數(shù)校驗--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <!--提供一些字符串操作--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional> </dependency> <!--knife4j接口--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>2.0.4</version> </dependency>
EnumValidate:用于對枚舉校驗的接口
/** * 用于實現(xiàn)枚舉類的校驗 */ public interface EnumValidate<T> { /** * 校驗枚舉值是否存在 */ boolean existValidate(T value); }
ActionTypeEnumValid:用于對枚舉類校驗的自定義注解
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = {ActionTypeEnumValidator.class}) @Documented public @interface ActionTypeEnumValid { String message() default ""; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; Class<?>[] target() default {}; /** * 允許的枚舉 * * @return */ Class<? extends Enum<?>> enumClass(); }
ActionTypeEnumValidator:枚舉校驗器
/** * 用于校驗ActionTypeEnumValidator */ public class ActionTypeEnumValidator implements ConstraintValidator<ActionTypeEnumValid,String> { private Class<? extends Enum> enumClass; @Override public void initialize(ActionTypeEnumValid actionTypeEnumValid) { enumClass = actionTypeEnumValid.enumClass(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null || "".equals(value)) { return true; } EnumValidate[] enums = (EnumValidate[]) enumClass.getEnumConstants(); if(enums ==null || enums.length == 0){ return false; } return enums[0].existValidate(value); } }
ActionTypeEnum:枚舉類
@Getter public enum ActionTypeEnum implements EnumValidate<String> { ACTION_INVOKR("invoke", "invoke"), UNKNOWN_ERROR("no", "no"); /** * 狀態(tài)值 */ private String couponType; /** * 狀態(tài)描述 */ private String couponTypeDesc; ActionTypeEnum(String couponType, String couponTypeDesc) { this.couponType = couponType; this.couponTypeDesc = couponTypeDesc; } public static String getDescByType(String couponType) { for (ActionTypeEnum type : ActionTypeEnum.values()) { if (type.couponType.equals(couponType) ) { return type.couponTypeDesc; } } return null; } /** * 判斷是否在枚舉類當中 * @param value * @return */ @Override public boolean existValidate(String value) { if (value == null || "".equals(value)) { return false; } for (ActionTypeEnum testEnum : ActionTypeEnum.values()) { if (testEnum.getCouponType().equalsIgnoreCase(value)) { return true; } } return false; } public String getcouponTypeStr() { return String.valueOf(this.couponType); } }
GlobalExceptionHandler:使用SpringMVC
提供的異常處理機制,對ValidationApi
的異常進行封裝
@RestControllerAdvice @Slf4j public class GlobalExceptionHandler { /** * 忽略參數(shù)異常處理器 * * @param e 忽略參數(shù)異常 * @return Response */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MissingServletRequestParameterException.class) public ResponseResult parameterMissingExceptionHandler(MissingServletRequestParameterException e) { log.error("參數(shù)異常", e); return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "請求參數(shù) " + e.getParameterName() + " 不能為空"); } /** * 缺少請求體異常處理器 * * @param e 缺少請求體異常 * @return Response */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseResult parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) { log.error("缺少請求體異常", e); return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "參數(shù)體不能為空"); } /** * 參數(shù)效驗異常處理器 * * @param e 參數(shù)驗證異常 * @return ResponseInfo */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseResult parameterExceptionHandler(MethodArgumentNotValidException e) { log.error("參數(shù)驗證異常", e); // 獲取異常信息 BindingResult exceptions = e.getBindingResult(); // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認消息 if (exceptions.hasErrors()) { List<ObjectError> errors = exceptions.getAllErrors(); if (!errors.isEmpty()) { // 這里列出了全部錯誤參數(shù),按正常邏輯,只需要第一條錯誤即可 FieldError fieldError = (FieldError) errors.get(0); return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), fieldError.getDefaultMessage()); } } return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR); } /** * 自定義參數(shù)錯誤異常處理器 * * @param e 自定義參數(shù) * @return ResponseInfo */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler({BusinessException.class}) public ResponseResult paramExceptionHandler(BusinessException e) { log.error("業(yè)務(wù)異常", e); // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認消息 if (!StringUtils.isEmpty(e.getMessage())) { return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), e.getMessage()); } return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR); } /** * 其他異常 * * @param e * @return */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler({Exception.class}) public ResponseResult otherExceptionHandler(Exception e) { log.error("其他異常", e); // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認消息 if (!StringUtils.isEmpty(e.getMessage())) { return new ResponseResult(CouponTypeEnum.UNKNOWN_ERROR.getcouponTypeStr(), e.getMessage()); } return new ResponseResult(CouponTypeEnum.UNKNOWN_ERROR); } }
驗證
請求的封裝類
/** * 指令的封裝類 */ @Getter @Setter @ToString public class CommandPOJO implements Serializable { private static final long serialVersionUID = -8497328408069586664L; //指令 @NotNull(message = "指令為必填項,不得為空") @ActionTypeEnumValid(message = "該指令暫不支持,暫時只支持invoke", enumClass = ActionTypeEnum.class) private String action ="invoke"; }
請求接口
@Valid
用于開啟請求參數(shù)校驗
@RestController @Slf4j @Api(value = "遠程調(diào)用模塊") @RequestMapping("/xiyuanrpc") public class RPCController { @PostMapping("/rpcNettybyInvoke") @ApiOperation(value = "rpc遠程調(diào)用") @InvokeParameterCheck @MethodLogPrint public ResponseResult rpcNettybyInvoke(@Valid @RequestBody CommandPOJO pojo) { return NettyClientUtil.rpcNetty(pojo); } }
通過Knife4j訪問對應(yīng)接口
源碼
項目源碼可從的我的github中獲?。?a rel="external nofollow" target="_blank" >github源碼地址
到此這篇關(guān)于SpringBoot使用validation-api實現(xiàn)對枚舉類參數(shù)校驗的方法的文章就介紹到這了,更多相關(guān)SpringBoot枚舉類參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring?Boot集成validation實現(xiàn)參數(shù)校驗功能
- SpringBoot使用Validation包進行輸入?yún)?shù)校驗
- SpringBoot使用Validation進行參數(shù)校驗的示例詳解
- SpringBoot集成Validation參數(shù)校驗
- SpringBoot使用validation做參數(shù)校驗的實現(xiàn)步驟
- SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例
- spring boot validation參數(shù)校驗實例分析
- springboot+dubbo+validation 進行rpc參數(shù)校驗的實現(xiàn)方法
- spring?參數(shù)校驗Validation示例詳解
相關(guān)文章
Spring-cloud-eureka使用feign調(diào)用服務(wù)接口
這篇文章主要為大家詳細介紹了Spring-cloud-eureka使用feign調(diào)用服務(wù)接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04SpringBoot用JdbcTemplates操作Mysql實例代碼詳解
JdbcTemplate是Spring框架自帶的對JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對數(shù)據(jù)庫的操作更加方便、友好,效率也不錯,這篇文章主要介紹了SpringBoot用JdbcTemplates操作Mysql2022-10-10如何使用java.security.SecureRandom安全生成隨機數(shù)和隨機字符串工具類
這篇文章主要給大家介紹了關(guān)于如何使用java.security.SecureRandom安全生成隨機數(shù)和隨機字符串工具類的相關(guān)資料,SecureRandom擴展了Random類,并通過在java 8中添加的新方法得到了豐富,需要的朋友可以參考下2024-05-05PowerJob的DesignateServer工作流程源碼解讀
這篇文章主要介紹了PowerJob的DesignateServer工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件【測試無誤】
這篇文章主要介紹了SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件的相關(guān)知識,感興趣的朋友跟隨腳本之家小編一起學習吧2018-05-05