包含@Valid的自定义组合注解校验失效,需要补充哪些配置?
问题根因
- 你用到的
@JacksonAnnotationsInside是Jackson框架专属的元注解,作用仅为告知Jackson扫描当前自定义注解上标注的Jackson相关注解,你这里的@JsonUnwrapped就是因为这个配置可以正常生效,但该注解对Java Bean Validation(javax.validation规范)的逻辑完全无影响。 - 默认情况下,Bean Validation的标准实现(比如业界最常用的Hibernate Validator)只会识别字段上直接标注的
@Valid注解来触发级联校验,不会自动读取自定义注解上作为元注解存在的@Valid,因此你的校验逻辑没有触发。
可行解决方案
方案一:Spring/Spring Boot环境最简方案(适配绝大多数业务场景)
如果你的项目基于Spring/Spring Boot开发,只需要扩展Spring的校验扫描逻辑即可:
- 在你自定义的
@ComplexUnwrapped注解上新增Spring的@Validated注解(org.springframework.validation.annotation.Validated,和原生@Valid效果一致,还额外支持分组校验能力):
@JsonUnwrapped @Valid @Validated // 新增Spring校验标记注解 @JacksonAnnotationsInside @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ComplexUnwrapped { // 新增分组属性,适配校验分组能力 Class<?>[] value() default {}; }
- Spring Boot场景下
LocalValidatorFactoryBean默认自动注入,无需额外配置,配置完成后字段上的@ComplexUnwrapped就可以同时触发JSON序列化的Unwrapped逻辑和级联校验逻辑。
方案二:原生Bean Validation通用方案(无Spring依赖场景)
如果你的项目没有依赖Spring,是纯Java环境使用Bean Validation,可以通过开启Hibernate Validator的元注解扫描配置实现:
初始化Validator的时候新增配置项,开启元注解约束扫描能力:
ValidatorFactory validatorFactory = Validation.byDefaultProvider() .configure() .addProperty("hibernate.validator.allow_meta_constraint_annotations", "true") .buildValidatorFactory(); Validator validator = validatorFactory.getValidator();
该配置生效后,Hibernate Validator会自动扫描所有元注解上的约束和级联标记,你自定义注解上的@Valid就可以被正常识别生效。
额外注意事项
- 如果你的自定义注解需要支持
@Valid的分组校验能力,可以在自定义注解中新增Class<?>[] groups() default {};属性,和标准校验注解的配置规则保持一致即可。 - 如果你使用的是升级后的Jakarta Validation(原javax.validation迁移后的新包),整体配置逻辑完全一致,仅需要替换对应类的包名即可。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

