spring-boot-starter-validation 数据校验

 

依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

查看LocalValidatorFactoryBean类的源码,发现默认的ValidationMessageSource(校验出错时的提示文件)是resources目录下的ValidationMessages.properties文件,因此在resources目录下创建ValidationMessages.properties文件

user.name.size=用户名长度介于5到10个字符之间
user.address.NotEmpty=用户地址不能为空NotEmpty
user.age.size=年龄输入不正确
user.email.notnull=邮箱不能为空notnull
user.email.pattern=邮箱格式不正确

 

创建User类,配置数据校验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Data
public class User2 {
 
    private Integer id;
 
    @AssertFalse(groups = ValidationGroup2.class)
    private Boolean enabled;
 
    @PastOrPresent(groups = ValidationGroup2.class)
    private Year birthday;
 
    @Size(min = 5, max = 10, message = "{user.name.size}", groups = ValidationGroup1.class)
    private String name;
 
    @NotEmpty(message = "{user.address.NotEmpty}", groups = ValidationGroup2.class)
    private String address;
 
    @Min(value = 1, message = "{user.age.size}", groups = ValidationGroup2.class)
    @DecimalMax(value = "200", message = "{user.age.size}")
    @Digits(integer = 3,fraction = 3,groups = ValidationGroup2.class)
    @NegativeOrZero(groups = ValidationGroup2.class)
    private Integer age;
 
    @Email(message = "{user.email.pattern}")
    @NotNull(message = "{user.email.notnull}", groups = {ValidationGroup1.class, ValidationGroup2.class})
    private String email;
 
}

  

配置完成后,接下来创建UserController:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@RestController
@RequestMapping("/valid")
public class UserValidatedController {
 
    /**
     * 给User参数添加@Validated注解,表示需要对该参数做校验,紧接着的BindingResult参数表示在校验出错时保存的出错信息
     *
     * @param user   user
     * @param result 在校验出错时保存的出错信息
     * @return 出错信息
     */
    @PostMapping("/user")
    // public List<String> addUser(@Validated @RequestBody User2 user, BindingResult result) {
    public List<String> addUser(@Validated(ValidationGroup2.class) @RequestBody User2 user, BindingResult result) {
        List<String> errors = new ArrayList<>();
        // 如果BindingResult中的hasErrors方法返回true,表示有错误信息,此时遍历错误信息,将之返回给前端。
        if (result.hasErrors()) {
            List<ObjectError> allErrors = result.getAllErrors();
            for (ObjectError error : allErrors) {
                errors.add(error.getDefaultMessage());
            }
        }
        return errors;
    }
 
    @PostMapping("/user2")
    public void user2(@Validated(ValidationGroup2.class) @RequestBody User2 user) {
    }
 
}

  

分组校验:

1
2
3
4
5
public interface ValidationGroup1 {
}
 
public interface ValidationGroup2 {
}

  

校验注解:

 

 

全域异常捕获:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
 
    //post请求参数校验抛出的异常
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public Response methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        /*//获取异常中随机一个异常信息
        FieldError fieldError = e.getBindingResult().getFieldError();
        return Response.buildFailure(fieldError.getCode(), fieldError.getDefaultMessage());*/
 
        return getResponse(e.getBindingResult(), e);
    }
 
    //get请求参数校验抛出的异常
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public Response bindExceptionHandler(BindException e) {
        /*//获取异常中随机一个异常信息
        FieldError fieldError = e.getBindingResult().getFieldError();
        return Response.buildFailure(fieldError.getCode(), fieldError.getDefaultMessage());*/
 
        return getResponse(e.getBindingResult(), e);
    }
 
    private Response getResponse(BindingResult bindingResult, Exception e) {
        List<String> errors = new ArrayList<>();
        if (bindingResult.hasErrors()) {
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError error : allErrors) {
                errors.add(error.getDefaultMessage());
            }
        }
        List<String> stringList = errors.stream().sorted().collect(Collectors.toList());// 排序
        return Response.buildFailure("", stringList.toString());
    }
}

  

 

posted @   草木物语  阅读(255)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2019-07-06 Spring MVC 国际化
2019-07-06 Spring MVC 为控制器添加通知与处理异常
点击右上角即可分享
微信分享提示