使用hibernate validation对参数进行优雅的校验

springboot天生支持使用hibernate validation对参数的优雅校验,如果不使用它,只能对参数挨个进行如下方式的手工校验,不仅难看,使用起来还很不方便:

if(StringUtils.isEmpty(userName)){ throw new RuntimeException("用户名不能为空"); }

下面将介绍hibernate validation的基本使用方法。

一、引入依赖

这里在springboot 2.4.1中进行实验,引入以下依赖:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.6.Final</version> </dependency> </dependencies> 二、基本请求参数校验

如下的一个spring mvc的请求调用中有一个id参数(Integer类型),如果不允许它为空,该怎么做

在Controller上加上@Validated注解

在需要校验的字段前面加上@NotNull(message = "用户id不能为空")注解

定义全局异常处理类,定制化返回结果

@RestControllerAdvice @Slf4j public class ValidationAdvice { @ExceptionHandler(Exception.class) @ResponseBody public WrapperResult handler(Exception e) { //获取异常信息,获取异常堆栈的完整异常信息 StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); //日志输出异常详情 log.error(sw.toString()); return WrapperResult.faild("服务异常,请稍后再试"); } @ExceptionHandler(ConstraintViolationException.class) @ResponseBody public WrapperResult handler(ConstraintViolationException e) { StringBuffer errorMsg = new StringBuffer(); Set<ConstraintViolation<?>> violations = e.getConstraintViolations(); violations.forEach(x -> errorMsg.append(x.getMessage()).append(";")); return WrapperResult.faild(errorMsg.toString()); } }

Controller层代码如下所示:

@RestController @Slf4j @RequestMapping("/user") @Validated public class UserController { /** * 根据id查询用户信息 * * @param id * @return */ @GetMapping public WrapperResult<UserModel> findUser(@NotNull(message = "用户id不能为空") @RequestParam(value = "id") String id) { return WrapperResult.success(new UserModel()); } }

如果发起请求127.0.0.1:8080/user?id= 则会返回结果

{ "status": 1, "data": "用户id不能为空;", "msg": "FAIL", "success": false } 三、对象内参数校验

上面是GET请求,下面介绍POST请求,请求对象内的参数校验。

1.Controller类上加上@Validated注解 @RestController @Slf4j @RequestMapping("/user") **@Validated** public class UserController { } 2.在POST请求方法参数前面加上@Validated 注解 @PostMapping("/mobile-regist") public WrapperResult<Boolean> mobileRegit(@Validated @RequestBody UserModel userModel) { return WrapperResult.success(true); } 3.在上面介绍的ValidationAdvice类中加上对象参数校验异常捕获 //处理校验异常,对于对象类型的数据的校验异常 @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public WrapperResult handler(MethodArgumentNotValidException e) { StringBuffer sb = new StringBuffer(); List<ObjectError> allErrors = e.getBindingResult().getAllErrors(); allErrors.forEach(msg -> sb.append(msg.getDefaultMessage()).append(";")); return WrapperResult.faild(sb.toString()); }

UserModel类的定义如下:

@Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class UserModel { @NotEmpty(message = "姓名不能为空") private String name; @NotEmpty(message = "手机号不能为空") // @Mobile(message = "手机号格式不正确") private String mobile; @NotEmpty(message = "电子邮箱不能为空") @Email(message = "电子邮箱格式不正确") private String email; private String password; private String address; @NotNull(message = "年龄不能为空") @Min(value = 12, message = "允许注册年龄最小为12岁") @Max(value = 24, message = "允许年龄最大为24岁") private Integer age; @NotEmpty(message = "联系人不允许为空") @Size(min = 1, max = 3, message = "联系人长度只允许1到3之间") private List<String> contacts; }

如果POST请求如下所示

{ "name":"", "mobile":"12666666666", "email":"", "password":"", "address":"", "age": null, "contacts":[ ] }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwwxj.html