Hibernate-Validator忽略is前缀Boolean getter的@NotNull约束,是bug吗?
这是Hibernate Validator的有意设计,而非Bug
你遇到的这个问题其实是Hibernate Validator遵循JavaBeans规范的有意行为,并不是软件bug。下面具体解释原因和解决方案:
JavaBeans规范的明确区分:JavaBeans规范里对布尔类型属性的getter命名做了明确区分:
- 对于**基本类型
boolean**的属性,既可以用isXxx(),也可以用getXxx()作为getter方法; - 对于**包装类型
Boolean**的属性,规范要求必须使用getXxx()作为getter方法,isXxx()仅适用于基本类型的布尔属性。
- 对于**基本类型
Hibernate Validator的属性识别逻辑:Hibernate Validator是通过JavaBeans Introspector来识别类中的属性和对应的访问方法的。当你的代码里出现返回
Boolean的isActivated()方法时,Introspector不会把它识别为属性activated的合法getter——因为这不符合包装类型布尔属性的规范。这就导致Hibernate Validator无法将标注在这个方法上的@NotNull约束绑定到对应的属性上,最终约束被忽略。而当你把方法名改成getActivated()后,完全符合规范,Validator就能正确识别并生效约束了。针对swagger-codegen的解决方案:既然你没法直接修改生成的代码,那就要调整swagger-codegen的配置,让它对
Boolean类型的属性生成getXxx()形式的getter。不同版本的swagger-codegen可能有不同的配置方式:- 有些版本支持通过配置参数(比如类似
useBooleanGetterPrefix=false这类参数)来控制; - 如果是自定义模板的场景,你可以修改对应的getter生成模板,让模板对
Boolean类型使用get前缀而非is前缀。
- 有些版本支持通过配置参数(比如类似
内容的提问来源于stack exchange,提问作者Stig Rohde Døssing
相关产品推荐
相关产品推荐

