代码地址:https://github.com/huiyiwu/spring-boot-simple/spring-boot-validated
Spring Boot 版本小于 2.3.x,spring-boot-starter-web 会自动引入 hibernate-validator 的依赖。如果 Spring Boot 版本大于 2.3.x,则需要手动引入依赖:
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
1. Controller类:
ValidatedController.java:
/**
* Author: Huchx
* Date: 2021/1/25 9:38
*/
@RestController
public class ValidatedController {
@RequestMapping(value = "/validate", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public String validated(@Validated UserVo userVo){
return "Validated Success";
}
}
2. Vo类
UserVo.java:
/**
* Author: Huchx
* Date: 2021/1/25 9:43
*/
public class UserVo implements Serializable {
public interface Default {
}
public interface Group1 {
}
@NotBlank(message = "userName不能为空")
private String userName;
@Max(value = 150,message = "年龄不能超过150")
@Min(value = 18,message = "最小年龄不能小于18")
private int age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3. 全局异常捕获
GlobalExceptionHandler.java:
/**
* Author: Huchx
* Date: 2021/1/25 9:48
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 使用Post方式请求,RequetBody接收时捕获
* @param exception
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) {
StringBuilder errorInfo = new StringBuilder();
BindingResult bindingResult = exception.getBindingResult();
for(int i = 0; i < bindingResult.getFieldErrors().size(); i++){
if(i > 0){
errorInfo.append(",");
}
FieldError fieldError = bindingResult.getFieldErrors().get(i);
errorInfo.append(fieldError.getField()).append(" :").append(fieldError.getDefaultMessage());
}
Map errResult = new HashMap();
errResult.put("message",errorInfo.toString());
errResult.put("code",500);
return errResult;
}
@ExceptionHandler(ConstraintViolationException.class)
public Map handleConstraintViolationException(ConstraintViolationException exception) {
StringBuilder msg = new StringBuilder();
Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
for (ConstraintViolation<?> constraintViolation : constraintViolations) {
PathImpl pathImpl = (PathImpl) constraintViolation.getPropertyPath();
String paramName = pathImpl.getLeafNode().getName();
String message = constraintViolation.getMessage();
msg.append("[").append(message).append("]");
}
Map errResult = new HashMap();
errResult.put("message",msg);
errResult.put("code",501);
return errResult;
}
/**
*使用Post方式,但不用JSON方式提交时捕获
* @param e
* @param request
* @return
*/
@ExceptionHandler(BindException.class)
public Map exceptionHandler(BindException e, HttpServletRequest request) {
String failMsg = e.getBindingResult().getFieldError().getDefaultMessage();
Map errResult = new HashMap();
errResult.put("message",failMsg);
errResult.put("code",502);
return errResult;
}
@ExceptionHandler(Exception.class)
public Map handleDefaultException(Exception exception) {
Map errResult = new HashMap();
errResult.put("message",exception.getMessage());
errResult.put("code",503);
return errResult;
}
}
4. 测试
在PostMan中测试:
7. 字段验证注解
字段 | 描述 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |