工程依赖
SpringBoot....
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Maven...
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.3.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.4.3.Final</version>
</dependency>
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
<version>1.5.1</version>
</dependency>
通用校验
Controller...
public Object test(@RequestBody @Validated ReqBO reqBO, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
List<ObjectError> allErrors = bindingResult.getAllErrors();
StringBuilder sbu = new StringBuilder();
allErrors.forEach(it -> sbu.append(it.getDefaultMessage()).append(";"));
}
System.out.println(allErrors);
return null;
}
ReqBO...
@Data
public class ReqBO{
@NotEmpty(message = "id不可为空!")
private String id;
private Person person;
...
}
入参id为空的时候就会提示定义的message,有些校验的message中可以使用变量。
穿透校验
对于BO嵌套BO的场景,需要对里层的BO进行判断。可对ReqBO 的Person加上注解@Valid
ReqBO...
@Data
public class ReqBO{
@NotEmpty(message = "id不可为空!")
private String id;
@Valid
private Person person;
...
}
Person...
public class Person{
@NotEmpty(message = "名字不可为空!")
@Length(max = 6, message = "名字最大长度为{max}")
private String name;
private int age;
}
有点场景要求要么Person对象为空的,要么Person对象里的属性全都不能为空,则将Person的属性都增加上校验。
若要求Person对象也不能为空,则
ReqBO...
@Data
public class ReqBO{
@NotEmpty(message = "id不可为空!")
private String id;
@Valid
@NotEmpty(message = "Person不可为空!")
private Person person;
...
}
同样支持List<Person>的场景
分组校验
Spring开发中会遇到这样的场景,同一个BO对象(包含嵌套其他BO)被用于不同的入口,入口之间所校验的属性不同,比如对于同一个属性有的需要判断非空,有的不需要判断。
ReqBO...
@Data
public class ReqBO {
public interface Default{}
public interface Other{}
@NotEmpty(message = "id不可为空!", groups = ReqBO.Default.class)
private String id;
@NotEmpty(message = "note不可为空!", groups = ReqBO.Other.class)
private String note;
@Valid
@NotEmpty(message = "Person不可为空!", groups = {ReqBO.Other.class, ReqBO.Default.class})
private Person person;
}
Controller...
public Object test1( @Validated(ReqBO.Default.class) ReqBO reqBO, BindingResult bindingResult) {
...
return null;
}
public Object test2( @Validated(ReqBO.Other.class) ReqBO reqBO, BindingResult bindingResult) {
...
return null;
}
public Object test3( @Validated({ReqBO.Default.class,ReqBO.Other.class}) ReqBO reqBO, BindingResult bindingResult) {
...
return null;
}
- 定义分组interface
- 属性增加groups(可指定多组)
- Controller加入分组(可指定多组)
组别相同才能校验。被验证的属性如果有分组,但是Controller没有指定任何分组,则不会校验
条件校验
最开始想根据业务对同一个字段进行区别校验,使用“条件判断”作为搜索条件没有找到相关信息,后发现分组判断可以解决。
对于项目中还有个场景需要根据某个属性值不同,对其他的属性进行非空判断,比如:属性O的值是1时需要对属性A做非空判断,当属性O的值是2时需要对属性B做非空判断。也没有找到合适的注解配置,因此在代码中实现的。