来源: Baeldung: 验证 Spring 控制器中的列表
以往使用 @Validated、@Valid 验证List 方法要么是创建一个符合javaBean规定的自定义的List实现,要么是注入javax.validation.Validator Bean 依赖 ,手动批量校验;
今天看到一个很神奇的校验集合的方式:
void validate(List<@Valid POJO> pojoList);
竟然将注解放在了尖括号里面???注解还能这样用?
写了个demo测试了一下,竟然真的有用??
@SpringBootTest
public class SpringTest {
@Validated
interface ValidatePOJO {
void validate(List<@Valid POJO> pojoList);
}
@Data
static class POJO{
@NotNull
private String a;
@NotBlank
private String b;
}
@TestConfiguration
static class config{
@Bean
ValidatePOJO validatePOJO(){
return System.out::println;
}
}
@Autowired
ValidatePOJO validatePOJO;
@Test
void test_2021_12_22_15_03_51() {
validatePOJO.validate(Arrays.asList(new POJO(),new POJO()));
}
}
运行结果:(校验结果是汉字是因为用了I18 资源包)
javax.validation.ConstraintViolationException: validate.pojoList[1].b: 不能为空, validate.pojoList[0].a: 不能为null, validate.pojoList[0].b: 不能为空, validate.pojoList[1].a: 不能为null
经过一番搜索,原来Java EE 更名后的Jakarta EE 在2019年8月发布了 Jakarta Bean Validation 2.0 标准,其官方实现Hibernate validator自6.x版本就依据标准开始支持容器元素校验:
支持通过注解参数化类型(泛型类型)参数来验证容器内的元素,如:List<@Positive Integer> positiveNumbers
更灵活的集合类型级联验证;例如,现在可以验证映射的值和键,如:Map<@Valid CustomerType, @Valid Customer> customersByType
顺带一提,内部静态类注解长这个样子
void validate(List<POJO.@Valid PO> poList);
这个方法可以说是非常6了
ps: 如果要使用同样方法测试 springboot版本应该在2.2以上(2.2以下使用的是junit4,测试方法应该不同)
最小demo validate-demo