parameter error

更新时间:2023-01-04 07:24:03 阅读: 评论:0


2023年1月4日发(作者:朝鲜人民生活)

SpringBoot使⽤validation-api实现对枚举类参数校验

SpringBoot使⽤validation-api实现对枚举类参数校验

前⾔

之前写了⼀个博客是关于使⽤SpringBoot使⽤validation-api实现参数校验,当时使⽤的注解都是validation-api⾃带的注解只能完成对空值、

长度等简单的校验,在我们⽇常的使⽤当中会遇到对参数是否在枚举值类的校验,针对这种情况我们怎么来实现呢?

SpringBoot使⽤validation-api实现参数校验可参考我的博客:

正⽂

SpringBoot使⽤validation-api实现对枚举类参数校验

ValidationApi框架就是⽤来解决参数校验中代码冗余问题,ValidationApi框架提供⼀些注解⽤来帮助我们对请求参数进⾏校验。

Maven依赖

tion

validation-api

s

commons-lang3

3.3.2

tlombok

lombok

1.18.2

true

in

knife4j-spring-boot-starter

2.0.4

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()){

Listerrors=Errors();

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小时内删除。

下一篇:担心你
标签:parameter error
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图