SpringBoot使⽤validation-api实现对枚举类参数校验SpringBoot使⽤validation-api实现对枚举类参数校验
前⾔
之前写了⼀个博客是关于使⽤SpringBoot使⽤validation-api实现参数校验,当时使⽤的注解都是validation-api⾃带的注解只能完成对空值、长度等简单的校验,在我们⽇常的使⽤当中会遇到对参数是否在枚举值类的校验,针对这种情况我们怎么来实现呢?
SpringBoot使⽤validation-api实现参数校验可参考我的博客:
正⽂
SpringBoot使⽤validation-api实现对枚举类参数校验
ValidationApi框架就是⽤来解决参数校验中代码冗余问题,ValidationApi框架提供⼀些注解⽤来帮助我们对请求参数进⾏校验。
Maven依赖
<!--参数校验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--提供⼀些字符串操作-->
<dependency>
<groupId>org.apachemons</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:⽤于对枚举校验的接⼝
/**
* ⽤于实现枚举类的校验
*/
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 = umClass();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context){
if(value == null ||"".equals(value)){
return true;
}
EnumValidate[] enums =(EnumValidate[]) EnumConstants();
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");
/
**
* 状态值
*/
private String couponType;
/**
* 状态描述
*/
private String couponTypeDesc;
ActionTypeEnum(String couponType, String couponTypeDesc){
validation框架
}
public static String getDescByType(String couponType){
for(ActionTypeEnum type : ActionTypeEnum.values()){
uponType.equals(couponType)){
uponTypeDesc;
}
}
return null;
}
/**
* 判断是否在枚举类当中
* @param value
* @return
*/
@Override
public boolean existValidate(String value){
if(value == null ||"".equals(value)){
return false;
}
for(ActionTypeEnum testEnum : ActionTypeEnum.values()){
CouponType().equalsIgnoreCase(value)){
return true;
}
}
return false;
}
public String getcouponTypeStr(){
return String.uponType);
}
}
GlobalExceptionHandler:使⽤SpringMVC提供的异常处理机制,对ValidationApi的异常进⾏封装@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 忽略参数异常处理器
*
* @param e 忽略参数异常
* @param e 忽略参数异常
* @return Response
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MissingServletRequestParameterException.class)
public ResponseResult parameterMissingExceptionHandler(MissingServletRequestParameterException e){
<("参数异常", e);
return new ResponseResult(CouponTypeEnum.uponTypeStr(),"请求参数 "+ e.getParameterName()+" 不能为空"); }
/**
* 缺少请求体异常处理器
*
* @param e 缺少请求体异常
* @return Response
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseResult parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e){
<("缺少请求体异常", e);
return new ResponseResult(CouponTypeEnum.uponTypeStr(),"参数体不能为空");
}
/**
* 参数效验异常处理器
*
* @param e 参数验证异常
* @return ResponseInfo
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseResult parameterExceptionHandler(MethodArgumentNotValidException e){
<("参数验证异常", e);
// 获取异常信息
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使⽤异常中的消息,否则使⽤默认消息
if(exceptions.hasErrors()){
List<ObjectError> errors = AllErrors();
if(!errors.isEmpty()){
// 这⾥列出了全部错误参数,按正常逻辑,只需要第⼀条错误即可
FieldError fieldError =(FieldError) (0);
return new ResponseResult(CouponTypeEnum.uponTypeStr(), DefaultMessage());
}
}
return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR);
}
/**
* ⾃定义参数错误异常处理器
*
* @param e ⾃定义参数
* @return ResponseInfo
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({BusinessException.class})
public ResponseResult paramExceptionHandler(BusinessException e){
<("业务异常", e);
// 判断异常中是否有错误信息,如果存在就使⽤异常中的消息,否则使⽤默认消息
if(!StringUtils.Message())){
return new ResponseResult(CouponTypeEnum.uponTypeStr(), e.getMessage());
}
return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR);
}
/**
* 其他异常
*
* @param e
* @return
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({Exception.class})
public ResponseResult otherExceptionHandler(Exception e){
<("其他异常", e);
// 判断异常中是否有错误信息,如果存在就使⽤异常中的消息,否则使⽤默认消息
if(!StringUtils.Message())){
return new ResponseResult(CouponTypeEnum.uponTypeStr(), 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 ⽤于开启请求参数校验
@RestController
@Slf4j
@Api(value ="远程调⽤模块")
@RequestMapping("/xiyuanrpc")
public class RPCController {
@PostMapping("/rpcNettybyInvoke")
@ApiOperation(value ="rpc远程调⽤")
@InvokeParameterCheck
@MethodLogPrint
public ResponseResult rpcNettybyInvoke(@Valid@RequestBody CommandPOJO pojo){
return NettyClientUtil.rpcNetty(pojo);
}
}
通过访问对应接⼝
源码
项⽬源码可从的我的github中获取:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论