SpringBoot之参数校验

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
SpringBoot之参数校验


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

在 SpringBoot 的世界里,参数校验是确保数据完整性和正确性的重要一环。它就像是一道坚固的防线,守护着我们的应用程序,防止恶意或错误的数据闯入。
想象一下,如果没有参数校验,我们的应用将会面临各种数据不一致、空指针异常等问题,就像是一场噩梦。但是,有了 SpringBoot 的参数校验功能,我们可以轻松地对传入的参数进行检查,确保它们符合我们的预期。
这就像是给我们的应用程序加上了一层保护罩,让我们可以放心地处理数据,而不用担心数据的质量问题。所以,让我们一起深入了解 SpringBoot 的参数校验吧,掌握它的奥秘,让我们的应用程序更加健壮和可靠!


提示:以下是本篇文章正文内容,下面案例可供参考

一、参数校验的重要性

在应用程序的各个层面,我们都需要对传入的参数进行校验,以确保它们符合预期的格式、范围和约束。参数校验可以帮助我们避免以下问题:

  • 数据不合法:通过对参数进行校验,可以确保数据符合业务规则和数据模型的要求。
  • 异常处理:在参数校验过程中,可以提前捕获和处理非法参数,避免在后续的业务逻辑中引发异常。
  • 安全性:通过参数校验,可以防止 SQL 注入、跨站脚本攻击等安全漏洞。

二、简单数据类型参数校验

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

  1. 引入validation起步依赖
<!-- 参数校验 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

  1. 在需要进行参数校验的实体类上添加@Validated注解,表示该类将进行参数校验。在参数前加校验注解,表示对这个参数进行具体的参数校验。
// 该控制器开启参数校验
@Validated
@Controller
public class TestController {
  @RequestMapping("/t1")
  @ResponseBody
  // 在参数前加校验注解,该注解的意思是字符串参数不能为null
  public String t1(@NotBlank String username){
    System.out.println(username);
    return "请求成功!";
   }
}

  1. 访问http://localhost:8080/t1,发现当没有传来参数时,会抛出ConstraintViolationException异常。
  2. 在校验参数的注解中添加message属性,可以替换异常信息。
// 该控制器开启参数校验
@Validated
@Controller
public class TestController {
  @RequestMapping("/t1")
  @ResponseBody
  // 在参数前加校验注解,该注解的意思是字符串参数不能为null
  public String t1(@NotBlank(message = "用户名不能为空") String username){
    System.out.println(username);
    return "请求成功!";
   }
}

除了@NotBlank,还有很多其他的注解

注解作用
注解 描述
@DecimalMax数值的最大值,可以包含小数。
@DecimalMin数值的最小值,可以包含小数。
@Digits设置必须是数字且数字整数的位数和小数的位数必须在指定范围内
@Future日期是否为将来的日期。
@Past日期是否为过去的日期。
@Max数值的最大值。
@Min数值的最小值。
@NotNull不能为null,可以是空
@Null必须为null
@NotBlank字符串的值不能为空白,即不能只包含空格。
@NotEmpty字符串、集合或数组的值不能为空,即长度大于0
@Pattern字符串是否匹配指定的正则表达式。
@Size字符串、集合或数组的大小是否在指定范围内。
@Email字符串是否为有效的电子邮件地址。
@Length长度必须在指定范围内
@Range值必须在指定范围内
@URL必须是一个URL
@AssertTrue布尔值是否为true。
@AssertFalse布尔值是否为false。

三、对象类型参数校验

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

  1. 添加实体类
public class Student {
  @NotNull(message = "id不能为空")
  private Integer id;
  @NotBlank(message = "姓名不能为空")
  private String name;
  // 省略getter/setter/tostring
}

  1. 编写控制器
@Controller
public class TestController2 {
  @RequestMapping("/t3")
  @ResponseBody
  // 校验的对象参数前添加@Validated,并将异常信息封装到BindingResult对象中
  public String t3(@Validated Student student,BindingResult result) {
    // 判断是否有参数异常
    if (result.hasErrors()) {
      // 所有参数异常
      List<ObjectError> list = result.getAllErrors();
      // 遍历参数异常,输出异常信息
      for (ObjectError err : list) {
        FieldError fieldError = (FieldError) err;
        System.out.println(fieldError.getDefaultMessage());
       }
      return "参数异常";
     }
    System.out.println(student);
    return "请求成功!";
   }
}

四、异常处理

ConstraintViolationException是 Java 的 Bean Validation API 抛出的异常,用于表示在验证数据对象时违反了约束条件。当你在 Java 中使用 Bean Validation 注解(如@NotNull、@Size等)来定义数据对象的约束条件,并尝试保存或更新一个违反这些约束条件的数据对象时,ConstraintViolationException就会被抛出。ConstraintViolationException包含了关于违反约束条件的详细信息,包括约束注解的名称、违反的属性路径以及相应的错误消息。这些信息可以帮助你定位和修复数据对象中的问题。

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

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>错误页面</title>
</head>
<body>
<h1>服务器开小差了!</h1>
</body>
</html>


总结

提示:这里对文章进行总结:

Spring Boot 参数校验是构建可靠和安全应用的重要组成部分。通过使用注解和验证器,我们可以轻松地对请求参数进行校验,并在异常情况下提供友好的错误消息。在实践中,遵循最佳实践,结合业务需求进行细粒度的参数校验,可以提高应用的可靠性和用户体验。