• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

springboot 搞代码 4年前 (2022-01-05) 18次浏览 已收录 0个评论

这篇文章主要介绍了SpringBoot使用validation-api实现参数校验的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

正文

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

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

注入依赖

 <!--参数校验--> javax.validationvalidation-api2.0.1.Final<!--提供一些字符串操作--> org.apache.commonscommons-lang33.3.2<!--lombok--> org.projectlomboklombok1.18.2true<!--knife4j接口--> com.github.xiaoyminknife4j-spring-boot-starter2.0.4

UserPojoReq.java请求封装类

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

 @Setter @Getter @ToString @ApiModel("用户对象") public class UserPojoReq extends Request implements Serializable { private static final long serialVersionUID = -354657839724457905L; @ApiModelProperty(required = true, notes = "主键", example = "123") private String id; @ApiModelProperty(required = true, notes = "用户名", example = "luo") @NotNull(message = "用户姓名为必填项,不得为空") @Size(min = 2,max = 20,message = "用户名长度要在2―8个字符") private String name; @ApiModelProperty(required = true, notes = "消息", example = "消息") private String msg; }

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 BusinessException extends RuntimeException { private static final long serialVersionUID = -1895174013651345407L; private final CouponTypeEnum errorCode; private String primaryErrorCode; private String primaryErrorMsg; private String primaryErrorIP; public BusinessException(CouponTypeEnum errorCode) { this(errorCode, errorCode.getCouponTypeDesc()); } public BusinessException(CouponTypeEnum errorCode, String message) { super(message); this.errorCode = errorCode; } public BusinessException(CouponTypeEnum errorCode, String message,String primaryErrorCode,String primaryErrorMsg,String primaryErrorIP) { super(message); this.errorCode = errorCode; 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 拦截异常并统一处理

  1. MissingServletRequestParameterException:必填项为null异常
  2. HttpMessageNotReadableException:参数类型不匹配异常
  3. MethodArgumentNotValidException:JSON校验失败异常(比如长度等)
  4. BusinessException:自定义的异常
  5. 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.<mark style="color:transparent">来源gaodaimacom搞#^代%!码&网</mark>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; } } 

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

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

以上就是SpringBoot使用validation-api实现参数校验的示例的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SpringBoot使用validation-api实现参数校验的示例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址