• SpringBoot参数校验


    目录

    一、简单数据类型校验

    1.1 编写相关Controller

    1.2 测试结果

    二、异常处理

    2.1 错误页面

    2.2 测试结果

    三、参数校验相关注解

    3.1 测试Controller

    3.2 测试结果

    四、对象类型参数校验

    4.1 添加实体类

    4.2 添加测试方法

    4.3 测试结果


    SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验,用法如下:

    首先得添加依赖



              org.springframework.boot
              spring-boot-starter-validation

    一、简单数据类型校验

    1.1 编写相关Controller

    1. @Validated
    2. @RestController
    3. public class TestController {
    4. @GetMapping("/t1")
    5. // name不能为空
    6. public String t1(@NotBlank String name){
    7. System.out.println(name);
    8. return name;
    9. }
    10. }

    在要开启参数校验的类上方添加Validated注解,代表该类开启参数校验,访问http://localhost:8080/t1,发现当没有传来参数时,会抛出 ConstraintViolationException 异常。 接下来让我们测试一下啪

    1.2 测试结果

    可以看到不能为空,表示t1路径下第一个参数不能为空,接下来我们输入参数看看

    如果我们不想输出这种提示信息,我们还可以自定义提示信息,这时就要在注解添加message属性,属性值代表错误信息

    public String t1(@NotBlank(message = "名字不能为空") String name){
        System.out.println(name);
        return name;
    }

    再运行看看

    这样就正常了。

    二、异常处理

    好喽,在上面我们可以看到异常页面不太好看,这样我们可以配置自定义的程序出现错误跳转的错误页面。

    当抛出 ConstraintViolationException 异常后,我们可以使用SpringMVC的异常处理器,也可以使用SpringBoot自带的异常处理机制。
    当程序出现了异常,SpringBoot会使用自带的 BasicErrorController 对象处理异常。该处理器会默认跳转到/resources/templates/error.html页面。

    2.1 错误页面

    1. HTML>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>错误页面title>
    6. head>
    7. <body>
    8. <h1>服务器开小差了~h1>
    9. body>
    10. html>

    2.2 测试结果

    OK,可以正常显示错误页面

    三、参数校验相关注解

    参数校验相关注解
    注解作用
    @NotNull判断包装类是否为null
    @NotBlank判断字符串是否为null或者是空串(去掉首尾空格)
    @NotEmpty判断集合是否为空
    @Length判断字符的长度(最大或者最小)
    @Min判断数值最小值
    @Max判断数值最大值
    @Email判断邮箱是否合法

    3.1 测试Controller

    1. @RequestMapping("/t2")
    2. public String t2(@NotBlank @Length(min = 1,max = 5) String name,
    3. @NotNull @Min(0) @Max(150) Integer age,
    4. @NotEmpty @RequestParam List address,
    5. @NotBlank @Email String email){
    6. System.out.println(name);
    7. System.out.println(age);
    8. System.out.println(address);
    9. System.out.println(email);
    10. return "请求成功";
    11. }

    OK,我们这个测试方法主要就是有四个参数,第一个name不能为空,且长度最小为1且不能超过5,第二个参数是年龄age,最小值为0且不能超过150, 第三个参数值就是address,这是一个集合,不能为空,第四个参数是邮箱,邮箱格式也要正确。

    3.2 测试结果

    OK,接下来我们测试一下什么都没有输入,直接测试

    接下来输入如下图

    四、对象类型参数校验

    SpringBoot也可以校验对象参数中的每个属性,用法如下:

    4.1 添加实体类

    1. package com.example.springbootdemo4.pojo;
    2. import jakarta.validation.constraints.Max;
    3. import jakarta.validation.constraints.Min;
    4. import jakarta.validation.constraints.NotBlank;
    5. import jakarta.validation.constraints.NotNull;
    6. public class Student {
    7. @NotBlank(message = "姓名不能为空")
    8. private String name;
    9. @NotNull(message = "年龄不能没有") @Min(6) @Max(18)
    10. private Integer age;
    11. public Student() {
    12. }
    13. public Student(String name, Integer age) {
    14. this.name = name;
    15. this.age = age;
    16. }
    17. public String getName() {
    18. return name;
    19. }
    20. public void setName(String name) {
    21. this.name = name;
    22. }
    23. public Integer getAge() {
    24. return age;
    25. }
    26. public void setAge(Integer age) {
    27. this.age = age;
    28. }
    29. @Override
    30. public String toString() {
    31. return "Student [" +
    32. "name='" + name + '\'' +
    33. ", age=" + age +
    34. " ]";
    35. }
    36. }

    4.2 添加测试方法

    1. @RequestMapping("/t3")
    2. public String t3(@Validated Student student, BindingResult brs){
    3. // 判断是否有参数异常
    4. if(brs.hasErrors()){
    5. // 所有参数异常
    6. List list = brs.getAllErrors();
    7. // 遍历参数异常输出信息
    8. list.forEach(System.out::println);
    9. return "参数异常";
    10. }
    11. System.out.println(student);
    12. return "success";
    13. }

    4.3 测试结果

    可以看到控制台输出可以识别到,

    Ok,这里乱码是因为这个模块的JDK版本较高,和项目版本不切合,但是我们可以知道他是表示年龄要在6-18的就好啦

  • 相关阅读:
    C#运算符执行顺序对照表
    RocketMQ消息批处理与消峰填谷
    【八大排序】java版(上)(冒泡、快排、堆排、选择排序)
    Python装饰器扫盲
    从String中提取基本类型或包装类数据
    【读书笔记】【Effective C++】设计与声明
    pyproj 2:CRS与高斯坐标转换
    时间轴_显示器
    explicit关键字
    在C#中使用 NLog 库进行日志记录
  • 原文地址:https://blog.csdn.net/qq_53317005/article/details/134016429