Spring Validation 校验集合新方法,竟然在泛型参数里加注解??

2,478 阅读1分钟

来源: 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

image.png

经过一番搜索,原来Java EE 更名后的Jakarta EE 在2019年8月发布了 Jakarta Bean Validation 2.0 标准,其官方实现Hibernate validator6.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