SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn)的方法
前言
之前寫了一個博客是關(guān)于使用SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn),當(dāng)時使用的注解都是validation-api自帶的注解只能完成對空值、長度等簡單的校驗(yàn),在我們?nèi)粘5氖褂卯?dāng)中會遇到對參數(shù)是否在枚舉值類的校驗(yàn),針對這種情況我們怎么來實(shí)現(xiàn)呢?
SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)可參考我的博客:SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)
正文
SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn)
ValidationApi框架就是用來解決參數(shù)校驗(yàn)中代碼冗余問題,ValidationApi框架提供一些注解用來幫助我們對請求參數(shù)進(jìn)行校驗(yàn)。
Maven依賴
<!--參數(shù)校驗(yàn)--> <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:用于對枚舉校驗(yàn)的接口
/**
* 用于實(shí)現(xiàn)枚舉類的校驗(yàn)
*/
public interface EnumValidate<T> {
/**
* 校驗(yàn)枚舉值是否存在
*/
boolean existValidate(T value);
}
ActionTypeEnumValid:用于對枚舉類校驗(yàn)的自定義注解
@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:枚舉校驗(yàn)器
/**
* 用于校驗(yàn)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;
}
/**
* 判斷是否在枚舉類當(dāng)中
* @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提供的異常處理機(jī)制,對ValidationApi的異常進(jìn)行封裝
@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ù)效驗(yàn)異常處理器
*
* @param e 參數(shù)驗(yàn)證異常
* @return ResponseInfo
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseResult parameterExceptionHandler(MethodArgumentNotValidException e) {
log.error("參數(shù)驗(yàn)證異常", e);
// 獲取異常信息
BindingResult exceptions = e.getBindingResult();
// 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
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);
// 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
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);
// 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
if (!StringUtils.isEmpty(e.getMessage())) {
return new ResponseResult(CouponTypeEnum.UNKNOWN_ERROR.getcouponTypeStr(), e.getMessage());
}
return new ResponseResult(CouponTypeEnum.UNKNOWN_ERROR);
}
}
驗(yàn)證
請求的封裝類
/**
* 指令的封裝類
*/
@Getter
@Setter
@ToString
public class CommandPOJO implements Serializable {
private static final long serialVersionUID = -8497328408069586664L;
//指令
@NotNull(message = "指令為必填項(xiàng),不得為空")
@ActionTypeEnumValid(message = "該指令暫不支持,暫時只支持invoke", enumClass = ActionTypeEnum.class)
private String action ="invoke";
}
請求接口
@Valid 用于開啟請求參數(shù)校驗(yàn)
@RestController
@Slf4j
@Api(value = "遠(yuǎn)程調(diào)用模塊")
@RequestMapping("/xiyuanrpc")
public class RPCController {
@PostMapping("/rpcNettybyInvoke")
@ApiOperation(value = "rpc遠(yuǎn)程調(diào)用")
@InvokeParameterCheck
@MethodLogPrint
public ResponseResult rpcNettybyInvoke(@Valid @RequestBody CommandPOJO pojo) {
return NettyClientUtil.rpcNetty(pojo);
}
}
通過Knife4j訪問對應(yīng)接口

源碼
項(xiàng)目源碼可從的我的github中獲?。?a rel="external nofollow" target="_blank" >github源碼地址
到此這篇關(guān)于SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn)的方法的文章就介紹到這了,更多相關(guān)SpringBoot枚舉類參數(shù)校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring?Boot集成validation實(shí)現(xiàn)參數(shù)校驗(yàn)功能
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
- SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解
- SpringBoot集成Validation參數(shù)校驗(yàn)
- SpringBoot使用validation做參數(shù)校驗(yàn)的實(shí)現(xiàn)步驟
- SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)的示例
- spring boot validation參數(shù)校驗(yàn)實(shí)例分析
- springboot+dubbo+validation 進(jìn)行rpc參數(shù)校驗(yàn)的實(shí)現(xiàn)方法
- spring?參數(shù)校驗(yàn)Validation示例詳解
相關(guān)文章
Spring-cloud-eureka使用feign調(diào)用服務(wù)接口
這篇文章主要為大家詳細(xì)介紹了Spring-cloud-eureka使用feign調(diào)用服務(wù)接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
SpringBoot用JdbcTemplates操作Mysql實(shí)例代碼詳解
JdbcTemplate是Spring框架自帶的對JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對數(shù)據(jù)庫的操作更加方便、友好,效率也不錯,這篇文章主要介紹了SpringBoot用JdbcTemplates操作Mysql2022-10-10
Java實(shí)現(xiàn)訂單超時自動取消的7種方案
在電商、外賣、票務(wù)等系統(tǒng)中,訂單超時未支付自動取消是一個常見的需求,這個功能乍一看很簡單,甚至很多初學(xué)者會覺得:"不就是加個定時器么?" 但真到了實(shí)際工作中,細(xì)節(jié)的復(fù)雜程度往往會超乎預(yù)期,本文給大家介紹了Java實(shí)現(xiàn)訂單超時自動取消的7種方案2024-12-12
如何使用java.security.SecureRandom安全生成隨機(jī)數(shù)和隨機(jī)字符串工具類
這篇文章主要給大家介紹了關(guān)于如何使用java.security.SecureRandom安全生成隨機(jī)數(shù)和隨機(jī)字符串工具類的相關(guān)資料,SecureRandom擴(kuò)展了Random類,并通過在java 8中添加的新方法得到了豐富,需要的朋友可以參考下2024-05-05
PowerJob的DesignateServer工作流程源碼解讀
這篇文章主要介紹了PowerJob的DesignateServer工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件【測試無誤】
這篇文章主要介紹了SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件的相關(guān)知識,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
使用vscode搭建javaweb項(xiàng)目的詳細(xì)步驟
我個人是很喜歡VsCode的,開源免費(fèi)、功能全面,所以為了方便,我把我?guī)缀跛械倪\(yùn)行都集成到了VsCode上來,JavaWeb也不例外,下面這篇文章主要給大家介紹了關(guān)于使用vscode搭建javaweb項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-11-11

