Hibernate Validator接口继承重写字段校验规则适配问题咨询
Hibernate Validator 接口约束覆盖解决方案
默认情况下Hibernate Validator会对继承/实现链上的所有同名getter方法约束做叠加校验,你当前场景中interface2定义的35位长度规则和interface1定义的75位长度规则会同时生效,最终实际生效的是更严格的35位限制,无法满足需求。以下是3种可落地的解决方案:
- 使用
@OverrideConstraint注解
这是Hibernate Validator原生提供的专门用于覆盖上层约束的注解,你只需要在interface1的getIdentifier()方法上,除了原有@Size(max = 75)注解外,新增@OverrideConstraint(includeCurrentConstraints = true)注解即可。配置后校验时会直接忽略父接口interface2中定义的同方法约束,仅执行interface1上定义的75位长度校验。 - 基于校验分组实现规则隔离
给interface2上的@Size(max = 35)指定专属校验分组,比如@Size(max = 35, groups = Interface2SpecialGroup.class),interface1上的@Size(max = 75)保留默认分组或者指定业务实际使用的校验分组,业务校验时只触发对应分组的校验规则,即可跳过interface2的35位长度限制。 - 修改全局校验配置关闭约束继承
如果项目全场景都不需要继承上层类/接口的约束,可以在Hibernate Validator配置项中将hibernate.validator.allow_constraint_extension参数设置为false。配置后所有重写方法的约束都会直接覆盖上层的同名方法约束,不会做叠加校验。注意该配置全局生效,修改前需要确认是否符合项目整体的校验规则设计。
注意:如果你的约束是直接声明在接口的字段上而非getter方法上,需要先将约束迁移到getter方法上再做上述配置,因为接口中定义的字段默认是
public static final类型,无法被子接口覆盖,只有getter方法的约束支持重写处理。
内容的提问来源于stack exchange,提问作者daly mohamed
相关产品推荐
相关产品推荐

