SpringBoot之参数校验
系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
SpringBoot之参数校验
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
在 SpringBoot 的世界里,参数校验是确保数据完整性和正确性的重要一环。它就像是一道坚固的防线,守护着我们的应用程序,防止恶意或错误的数据闯入。
想象一下,如果没有参数校验,我们的应用将会面临各种数据不一致、空指针异常等问题,就像是一场噩梦。但是,有了 SpringBoot 的参数校验功能,我们可以轻松地对传入的参数进行检查,确保它们符合我们的预期。
这就像是给我们的应用程序加上了一层保护罩,让我们可以放心地处理数据,而不用担心数据的质量问题。所以,让我们一起深入了解 SpringBoot 的参数校验吧,掌握它的奥秘,让我们的应用程序更加健壮和可靠!
提示:以下是本篇文章正文内容,下面案例可供参考
一、参数校验的重要性
在应用程序的各个层面,我们都需要对传入的参数进行校验,以确保它们符合预期的格式、范围和约束。参数校验可以帮助我们避免以下问题:
- 数据不合法:通过对参数进行校验,可以确保数据符合业务规则和数据模型的要求。
- 异常处理:在参数校验过程中,可以提前捕获和处理非法参数,避免在后续的业务逻辑中引发异常。
- 安全性:通过参数校验,可以防止 SQL 注入、跨站脚本攻击等安全漏洞。
二、简单数据类型参数校验
SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验,用法如下:
- 引入validation起步依赖
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 在需要进行参数校验的实体类上添加@Validated注解,表示该类将进行参数校验。在参数前加校验注解,表示对这个参数进行具体的参数校验。
// 该控制器开启参数校验
@Validated
@Controller
public class TestController {
@RequestMapping("/t1")
@ResponseBody
// 在参数前加校验注解,该注解的意思是字符串参数不能为null
public String t1(@NotBlank String username){
System.out.println(username);
return "请求成功!";
}
}
- 访问http://localhost:8080/t1,发现当没有传来参数时,会抛出ConstraintViolationException异常。
- 在校验参数的注解中添加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 | 字符串、集合或数组的大小是否在指定范围内。 |
字符串是否为有效的电子邮件地址。 | |
@Length | 长度必须在指定范围内 |
@Range | 值必须在指定范围内 |
@URL | 必须是一个URL |
@AssertTrue | 布尔值是否为true。 |
@AssertFalse | 布尔值是否为false。 |
三、对象类型参数校验
SpringBoot也可以校验对象参数中的每个属性,用法如下:
- 添加实体类
public class Student {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "姓名不能为空")
private String name;
// 省略getter/setter/tostring
}
- 编写控制器
@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 参数校验是构建可靠和安全应用的重要组成部分。通过使用注解和验证器,我们可以轻松地对请求参数进行校验,并在异常情况下提供友好的错误消息。在实践中,遵循最佳实践,结合业务需求进行细粒度的参数校验,可以提高应用的可靠性和用户体验。