文章目录
- 一,引入JSR 303依赖
- 二,接口参数启用校验功能
- 三,给字段添加校验注解
- `@NotBlank` 和 `@NotNull` 的区别
- @NotBlank
- @NotNull
- 比较
- 四,BindingResult获取校验结果
- 五,自定义错误消息
- 六,其他校验规则
在Web应用程序中,数据的有效性和合法性至关重要。前端虽能提供初步的表单校验,但在后端再次进行校验是必要的,以确保数据的质量并保护系统免受恶意输入的影响。
这一节详细介绍如何在Spring Boot项目中使用JSR 303(Java Specification Request 303)进行数据校验。
一,引入JSR 303依赖
JSR 303定义了一组用于Java Bean属性校验的标准注解。Spring Boot框架内置了对JSR 303的支持,这使得我们可以在实体类中轻松添加校验逻辑。
springboot2.3.0
以上需要手动引入依赖,引入到common
模块中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
还在在product模块的配置文件中新增如下配置:
server:
error: #303校验错误信息提示
include-binding-errors: always
include-message: always
如果没有以上配置,则后端不会在响应中返回
二,接口参数启用校验功能
- BrandController:
- @Valid: 标注在接收Brand对象的方法参数上,表示该对象需要进行校验。如下在save方法的brand参数前加了注解@Valid,标识要对这个对象进行校验,校验规则由该类字段上的注解确定。
- BindingResult: 紧跟在被校验的对象之后,用于获取校验结果。
三,给字段添加校验注解
在需要校验的实体类的自动上添加对应的注解,以BrandEntity为例。
- @NotBlank: 标注在品牌名字段上,表示该字段必须包含至少一个非空字符。
public class BrandEntity{
@NotBlank(message="name不能为空")
private String name;
// 其他字段和getter/setter...
}
添加了注解后,如果参数不符合校验规则,后端会中断请求,在响应中包含错误提示信息。
- 发送POST请求到
/brands/save
端点,提交一个空的品牌名称。 - 验证响应状态码为
400 Bad Request
。 - 查看响应体中的错误信息。
@NotBlank
和 @NotNull
的区别
@NotBlank
和 @NotNull
是 Java 中用于验证输入数据的两种不同的注解,它们都属于 JSR 303/JSR 349 (Hibernate Validator)
的一部分,用于 Spring Boot 和其他基于 Java 的 Web 应用程序中进行数据校验。
@NotBlank
此注解用于检查字符串类型的值是否为空(null)、空字符串 (""
) 或仅由空白字符组成。如果字符串为空、为空字符串或只包含空白字符,则验证失败。适用于 String
类型。
示例用法:
@NotBlank(message = "品牌名必须提交")
private String name;
@NotNull
此注解用于检查值是否为 null。与 @NotBlank
不同,@NotNull
可以应用于任何类型的变量,不仅仅限于字符串。如果一个对象为 null,则验证失败。
示例用法:
@NotNull(message = "Logo必须提交")
private String logo;
比较
-
适用范围:
@NotBlank
: 仅适用于String
类型。@NotNull
: 可以应用于任何类型。
-
验证条件:
@NotBlank
: 检查字符串是否为空、为空字符串或仅由空白字符组成。@NotNull
: 检查对象是否为 null。
四,BindingResult获取校验结果
当校验不通过时,默认的响应数据结构可能不符合我们的要求,可以通过BindingResult在接口中获取校验信息,封装为自定义的响应结构。
让我们通过具体的例子来看看其是如何工作的。
我们可以通过BindingResult获取校验结果,并将其封装在一个Map中,返回给前端。
import javax.validation.
```java
@RestController
@RequestMapping("/brands")
public class BrandController {
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
if(result.hasErrors()){
Map<String,String> map = new HashMap<>();
//1、获取校验的错误结果
result.getFieldErrors().forEach((item)->{
//FieldError 获取到错误提示
String message = item.getDefaultMessage();
//获取错误的属性的名字
String field = item.getField();
map.put(field,message);
});
return R.error(400,"提交的数据不合法").put("data",map);
}
brandService.save(brand);
return R.ok();
}
}
接口接收到不合法的参数后,会给出如下响应,更灵活更清晰,可读性更强。
五,自定义错误消息
每个注解都有默认的错误提示,配置在ValidationMessages.properties
文件中。
但是,我们可以在自动注解的message
属性自定义错误提示。
@NotNull(message = "Logo必须提交")
private String logo;
六,其他校验规则
除了品牌名,我们还可以为其他字段添加校验注解,例如:
- Logo URL:
- @NotNull & @URL: 标注在Logo字段上,表示该字段必须不为空且是一个有效的URL。
@NotNull(message = "Logo必须提交")
@URL(message = "Logo必须是一个合法的URL地址")
private String logo;
- First Letter:
- @Pattern: 标注在首字母字段上,表示该字段必须满足特定的正则表达式。
@Pattern(regexp = "^[a-zA-Z]$",
message = "检索首字母必须是一个字母")
private String firstLetter;
- Sort:
- @Min: 标注在排序字段上,表示该字段必须大于等于0。
@Min(value = 0, message = "排序必须大于等于0")
private Integer sort;