我们在开发java项目的时候,经常需要对参数进行一些必填项、格式、长度等进行校验,如果手写代码对参数校验,每个接口会需要很多低级的代码,这样会降低代码的可读性。那么我们能不能使用一种比较优雅的方式来实现,对请求中的参数进行校验呢?

knife4j的安装与使用可参考我的博客:SpringBoot使用knife4j进行在线接口调试

正文

ValidationApi框架就是用来解决参数校验中代码冗余问题,ValidationApi框架提供一http://www.cppcns.com些注解用来帮助我们对请求参数进行校验:

9f6b7b923605fd0934f1cd1e3b3d12b1.png

SpringBoot使用validation-api实现参数校验

注入依赖

javax.validation

validation-api

2.0.1.Final

org.apache.commons

commons-lang3

3.3.2

org.projectlombok

lombok

1.18.2

true

com.github.xiaoymin

knife4j-spring-boot-starter

2.0.4

UserPojoReq.java请求封装类

如果成员变量是其他对象实体,该变量必须加 @Valid,否则嵌套中的验证不生效

@Setter

@Getter

@ToString

@ApiMod

CouponTypeEnum.class :错误码枚举类

@Getter

public enum CouponTypeEnum {

PARAMETER_ERROR(1001, "请求参数有误!"),

UNKNOWN_ERROR(9999, "未知的错误!”);

/**

* 状态值

*/

private int couponType;

/**

* 状态描述

*/

private String couponTypeDesc;

CouponTypeEnum(int couponType, String couponTypeDesc){

this.couponType = couponType;

this.couponTypeDesc = couponTypeDesc;

}

public static String getDescByType(int couponType) {

for (CouponTypeEnum type : CouponTypeEnum.values()) {

if (type.couponType == couponType) {

return type.couponTypeDesc;

}

}

return null;

}

public String getcouponTypeStr(){

return String.valueOf(this.couponType);

}

}

BusinessException.java:自定义业务异常类

/**

* 业务自定义异常

*/

@Getter

public class BusinessExcepthttp://www.cppcns.come;

this.primaryErrorCode=primaryErrorCode;

this.primaryErrorMsg=primaryErrorMsg;

this.primaryErrorIP=primaryErrorIP;

}

public BusinessException(CouponTypeEnum errorCode,String primaryErrorCode,String primaryErrorMsg,String primaryErrorIP) {

this(errorCode, errorCode.getCouponTypeDesc());

this.primaryErrorCode=primaryErrorCode;

this.primaryErrorMsg=primaryErrorMsg;

this.primaryErrorIP=primaryErrorIP;

}

}

GlobalExceptionHandler.class 拦截异常并统一处理

MissingServletRequestParameterException:必填项为null异常

HttpMessageNotReadableException:参数类型不匹配异常

MethodArgumentNotValidException:jsON校验失败异常(比如长度等)

BusinessException:自定义的异常

Exception:其他异常

@RestControllerAdvice("com.luo.producer.controller")

@Slf4j

public class GlobalExceptionHandler {

/**

* 忽略参数异常处理器

*

* @param e 忽略参数异常

* @return Response

*/

@ResponseStatus(HttpStatus.BAD_REQUEST)

@ExceptionHandler(MissingServletRequestParameterException.class)

public Response parameterMissingExceptionHandler(MissingServletRequestParameterException e) {

log.error("", e);

return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "请求参数 " + e.getParameterName() + " 不能为空");

}

/**

* 缺少请求体异常处理器

*

* @param e 缺少请求体异常

* @return Response

*/

@ResponseStatus(HttpStatus.BAD_REQUEST)

@ExceptionHandler(HttpMessageNotReadableException.class)

public Response parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {

log.error("", e);

return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "参数体不能为空");

}

/**

* 参数效验异常处理器

*

* @param e 参数验证异常

* @return ResponseInfo

*/

@ResponseStatus(HttpStatus.BAD_REQUEST)

@ExceptionHandler(MethodArgumentNotValidException.class)

public Response parameterExceptionHandler(MethodArgumentNotValidException e) {

log.error("", e);

// 获取异常信息

BindingResult exceptions = e.getBindingResult();

// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息

if (exceptions.hasErrors()) {

List errors = exceptions.getAllErrors();

if (!errors.isEmpty()) {

// 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可

FieldError fieldError = (FieldError) errors.get(0);

return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), fieldError.getDefaultMessage());

}

}

return new Response(CouponTypeEnum.PARAMETER_ERROR);

}

/**

* 自定义参数错误异常处理器

*

* @param e 自定义参数

* @return ResponseInfo

*/

@ResponseStatus(HttpStatus.BAD_REQUEST)

@ExceptionHandler({BusinessException.class})

public Response paramExceptionHandler(BusinessException e) {

log.error("", e);

// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息

if (!StringUtils.isEmpty(e.getMessage())) {

return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), e.getMessage());

}

return new Response(CouponTypeEnum.PARAMETER_ERROR);

}

/**

* 其他异常

*

* @param e

* @return

*/

@ResponseStatus(HttpStatus.BAD_REQUEST)

@ExceptionHandler({Exception.class})

public Response otherExceptionHandler(Exception e) {

log.error("其他异常", e);

// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息

if (!StringUtils.isEmpty(e.getMessage())) {

return new Response(CouponTypeEnum.UNKNOWN_ERROR.getcouponTypeStr(), e.getMessage());

}

return new Response(CouponTypeEnum.UNKNOWN_ERROR);

}

}

验证

测试接口

@Valid被标记的实体将会开启一个校验的功能

@RequestBody:请求实体需要加上@RequestBody否则MethodArgumentNotValidException异常将会被识别成Exception异常,提示信息将与预期不符。

@RestController

@Slf4j

public class UserController {

@PostMapping("/helloluo")

@MyPermissionTag(value = "true")

public String helloluo(@RequestBody @Valid UserPojoReq userPojoReq){

return "Hello World”+userPojoReq;QdSMCg

}

}

模拟请求参数,进行接口访问:

108280ff592d455876e4349083a4de82.png

到此这篇关于SpringBoot使用validation-api实现参数校验的示例的文章就介绍到这了,更多相关SpringBoot validation参数校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: SpringBoot使用validation-api实现参数校验的示例

本文地址: http://www.cppcns.com/ruanjian/java/342994.html

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐