在 Spring Boot 中,可以使用 Validator 来验证表单数据和其他输入数据的有效性。
通常来说,在前端提交数据到后端的时候,会进行一定的校验,比如使用jqueryvalidatejs或者当前留下的Vue框架中的vue-validator进行校验。但是这样还会有一定的风险,所以我们会在后台对数据格式进行校验。在Java或Hibernate中都提供了一些校验的注解,本节学习使用后台校验数据格式。
先来讲讲实体类属性上的一些注解:
一、注解
注解 | 描述 |
@Valid | 被注释的元素是一个对象,需要检查此对象的所有字段值。 |
@Null | 被注释的元素必须为null。 |
@NotNull | 被注释的元素必须不为null |
@AssertTrue | 被注释的元素必须为true |
@AssertFalse | 被注释的元素必须为false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值。 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值。 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值。 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值。 |
@Size(maxmin) | 被注释的元素的大小必须在指定的范围内。 |
@Digits(integer,fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内。 |
@Past | 被注释的元素必须是一个过去的日期。 |
@Future | 被注释的元素必须是一个将来的日期。 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式。 |
被注释的元素必须是电子邮箱地址。 | |
@Length(min=max=) | 被注释的字符串的大小必须在指定的范围内。 |
@NotEmpty | 被注释的字符串必须非空。 |
@Range(min=max=) | 被注释的元素必须在合适的范围内。 |
@NotBlank | 被注释的字符串必须非空。 |
@URL(protocol=,host=port=regexp=flags=) | 被注释的字符串必须是一个有效的URL。 |
@CreditCardNumber | 被注释的字符串必须通过Luhn校验算法,银行卡、信用卡等号码一般 都用Luhn 计算合法性。 |
@ScriptAssert(lang=script=alias=) | 要有Java ScriptingAPI,即JSR223(“Scriptingfor the JavaTMPlatform”)的实现。 |
@SafeHtml(whitelistType=additionalTags=) | classpath中要有jsoup包。 |
@NotNull、@NotEmpty、@NotBlank三个注解的区别如下:
@NotNull:任何对象的value不能为null。
@NotEmpty:集合对象的元素不为0,即集合不为空,也可以用于字符串不为null List item
@NotBlank:只能用于字符串不为null,并且字符串trim)以后length要大于0。
二、集成步骤
下面是使用 Validator 的步骤:
1、导入依赖
<!--validator后台校验-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、实体类注解
@Data
public class Person {
@NotNull //该属性不能为空
private String name;
@NumberFormat //要符合数值类型
private Integer age;
@Email //被注解的元素必须是电子邮箱地址格式。
private String email;
}
3、controller参数使用
创建一个TestController进行测试。使用BindingResult类的getAllErrors()方法可以获取不符合校验的提示集合,具体怎么展示可以根据项目情况决定,这里是将错误信息拼接成字符串返回前台:
@PostMapping("/validator")
//@Valid:被注解的元素是一个对象,需要检查此对象的所有字段值。
//BindingResult:使用BindingResult类的getAllErrors()方法可以获取不符合校验的提示集合,
// 具体怎么展示可以根据项目情况决定,这里是将错误信息拼接成字符串返回前台:
public StringBuffer postTest2(@RequestBody @Valid Person person, BindingResult bindingResult){
StringBuffer stringBuffer= new StringBuffer();
if(bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();//不符合校验的提示集合
list.forEach(error->{
stringBuffer.append(error.getDefaultMessage());//不符合校验的信息,append:字符串拼接
stringBuffer.append(" || ");
System.out.println(error.getDefaultMessage());
});
}
System.out.println("postTest2");
return stringBuffer;//这里是将错误信息拼接成字符串返回前台
}