SpringBoot使⽤validation-api实现对枚举类参数校验
SpringBoot使⽤validation-api实现对枚举类参数校验
前⾔
之前写了⼀个博客是关于使⽤SpringBoot使⽤validation-api实现参数校验,当时使⽤的注解都是validation-api⾃带的注解只能完成对空值、
长度等简单的校验,在我们⽇常的使⽤当中会遇到对参数是否在枚举值类的校验,针对这种情况我们怎么来实现呢?
SpringBoot使⽤validation-api实现参数校验可参考我的博客:
正⽂
SpringBoot使⽤validation-api实现对枚举类参数校验
ValidationApi框架就是⽤来解决参数校验中代码冗余问题,ValidationApi框架提供⼀些注解⽤来帮助我们对请求参数进⾏校验。
Maven依赖
EnumValidate:⽤于对枚举校验的接⼝
/**
*⽤于实现枚举类的校验
*/
publicinterfaceEnumValidate
/**
*校验枚举值是否存在
*/
booleanexistValidate(Tvalue);
}
ActionTypeEnumValid:⽤于对枚举类校验的⾃定义注解
@Target({,,TION_TYPE})
@Retention(E)
@Constraint(validatedBy={})
@Documented
public@interfaceActionTypeEnumValid{
Stringmessage()default"";
Class<?>[]groups()default{};
Class<?extendsPayload>[]payload()default{};
Class<?>[]target()default{};
/**
*允许的枚举
*
*@return
*/
Class<?extendsEnum<?>>enumClass();
}
ActionTypeEnumValidator:枚举校验器
/**
*⽤于校验ActionTypeEnumValidator
*/
publicclassActionTypeEnumValidatorimplementsConstraintValidator
privateClass<?extendsEnum>enumClass;
@Override
publicvoidinitialize(ActionTypeEnumValidactionTypeEnumValid){
enumClass=ass();
}
@Override
publicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){
if(value==null||"".equals(value)){
returntrue;
}
EnumValidate[]enums=(EnumValidate[])mConstants();
if(enums==null||==0){
returnfal;
}
returnenums[0].existValidate(value);
}
}
ActionTypeEnum:枚举类
@Getter
publicenumActionTypeEnumimplementsEnumValidate
ACTION_INVOKR("invoke","invoke"),
UNKNOWN_ERROR("no","no");
/**
*状态值
*/
privateStringcouponType;
/**
*状态描述
*/
privateStringcouponTypeDesc;
ActionTypeEnum(StringcouponType,StringcouponTypeDesc){
Type=couponType;
TypeDesc=couponTypeDesc;
}
publicstaticStringgetDescByType(StringcouponType){
for(ActionTypeEnumtype:()){
if((couponType)){
TypeDesc;
}
}
returnnull;
}
/**
*判断是否在枚举类当中
*@paramvalue
*@return
*/
@Override
publicbooleanexistValidate(Stringvalue){
if(value==null||"".equals(value)){
returnfal;
}
for(ActionTypeEnumtestEnum:()){
if(ponType().equalsIgnoreCa(value)){
returntrue;
}
}
returnfal;
}
publicStringgetcouponTypeStr(){
f(Type);
}
}
GlobalExceptionHandler:使⽤SpringMVC提供的异常处理机制,对ValidationApi的异常进⾏封装
@RestControllerAdvice
@Slf4j
publicclassGlobalExceptionHandler{
/**
*忽略参数异常处理器
*
*@parame忽略参数异常
*@parame忽略参数异常
*@returnRespon
*/
@ResponStatus(_REQUEST)
@ExceptionHandler()
publicResponResultparameterMissingExceptionHandler(MissingServletRequestParameterExceptione){
("参数异常",e);
returnnewResponResult(TER_ponTypeStr(),"请求参数"+ameterName()+"不能为空");
}
/**
*缺少请求体异常处理器
*
*@parame缺少请求体异常
*@returnRespon
*/
@ResponStatus(_REQUEST)
@ExceptionHandler()
publicResponResultparameterBodyMissingExceptionHandler(HttpMessageNotReadableExceptione){
("缺少请求体异常",e);
returnnewResponResult(TER_ponTypeStr(),"参数体不能为空");
}
/**
*参数效验异常处理器
*
*@parame参数验证异常
*@returnResponInfo
*/
@ResponStatus(_REQUEST)
@ExceptionHandler()
publicResponResultparameterExceptionHandler(MethodArgumentNotValidExceptione){
("参数验证异常",e);
//获取异常信息
BindingResultexceptions=dingResult();
//判断异常中是否有错误信息,如果存在就使⽤异常中的消息,否则使⽤默认消息
if(ors()){
List
if(!y()){
//这⾥列出了全部错误参数,按正常逻辑,只需要第⼀条错误即可
FieldErrorfieldError=(FieldError)(0);
returnnewResponResult(TER_ponTypeStr(),aultMessage());
}
}
returnnewResponResult(TER_ERROR);
}
/**
*⾃定义参数错误异常处理器
*
*@parame⾃定义参数
*@returnResponInfo
*/
@ResponStatus(_REQUEST)
@ExceptionHandler({})
publicResponResultparamExceptionHandler(BusinessExceptione){
("业务异常",e);
//判断异常中是否有错误信息,如果存在就使⽤异常中的消息,否则使⽤默认消息
if(!y(sage())){
returnnewResponResult(TER_ponTypeStr(),sage());
}
returnnewResponResult(TER_ERROR);
}
/**
*其他异常
*
*@parame
*@return
*/
@ResponStatus(_REQUEST)
@ExceptionHandler({})
publicResponResultotherExceptionHandler(Exceptione){
("其他异常",e);
//判断异常中是否有错误信息,如果存在就使⽤异常中的消息,否则使⽤默认消息
if(!y(sage())){
returnnewResponResult(N_ponTypeStr(),sage());
}
returnnewResponResult(N_ERROR);
}
}
验证
请求的封装类
/**
*指令的封装类
*/
@Getter
@Setter
@ToString
publicclassCommandPOJOimplementsSerializable{
privatestaticfinallongrialVersionUID=-84973284L;
//指令
@NotNull(message="指令为必填项,不得为空")
@ActionTypeEnumValid(message="该指令暂不⽀持,暂时只⽀持invoke",enumClass=)
privateStringaction="invoke";
}
请求接⼝
@Valid⽤于开启请求参数校验
@RestController
@Slf4j
@Api(value="远程调⽤模块")
@RequestMapping("/xiyuanrpc")
publicclassRPCController{
@PostMapping("/rpcNettybyInvoke")
@ApiOperation(value="rpc远程调⽤")
@InvokeParameterCheck
@MethodLogPrint
publicResponResultrpcNettybyInvoke(@Valid@RequestBodyCommandPOJOpojo){
ty(pojo);
}
}
通过访问对应接⼝
源码
项⽬源码可从的我的github中获取:
本文发布于:2023-01-04 07:24:03,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/89436.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |