SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn)的方法
前言
之前寫了一個博客是關(guān)于使用SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn),當(dāng)時(shí)使用的注解都是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 = "該指令暫不支持,暫時(shí)只支持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)文章
Java面試題之this 和 super 的區(qū)別解析
this 和 super 雖然都是Java中的關(guān)鍵字,但它們的作用和使用場景有著明顯的區(qū)別,下面給大家介紹Java面試題之this 和 super 的區(qū)別解析,感興趣的朋友一起看看吧2025-05-05
Java同步框架AbstractQueuedSynchronizer詳解
本篇文章主要介紹了Java同步框架AbstractQueuedSynchronizer詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
idea全局搜索快捷鍵超詳細(xì)總結(jié)(推薦!)
在實(shí)際開發(fā)中項(xiàng)目會非常多,如何在項(xiàng)目中快速定位,你說需要找到的類或方法,可以利用idea的全局搜索功能,下面這篇文章主要給大家分享介紹了關(guān)于idea全局搜索快捷鍵超詳細(xì)總結(jié)的相關(guān)資料,需要的朋友可以參考下2023-01-01
Java實(shí)現(xiàn)字符編碼轉(zhuǎn)換(utf-8/gbk)
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)字符編碼轉(zhuǎn)換工具,主要針對UTF-8和GBK兩種編碼格式,文中的示例代碼講解詳,需要的可以了解下2025-03-03
Java 靜態(tài)數(shù)據(jù)初始化的示例代碼
這篇文章主要介紹了Java 靜態(tài)數(shù)據(jù)初始化的示例代碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-09-09
IntelliJ?IDEA中引入自定義JAR包詳細(xì)步驟
導(dǎo)入JAR包是使用其他模塊或庫開發(fā)Java應(yīng)用程序的必要步驟,這篇文章主要介紹了IntelliJ?IDEA中引入自定義JAR包的詳細(xì)步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-12-12

