Wildfly 12.0+Hibernate环境下@NotBlank注解不识别问题咨询
嘿,这个问题我之前也碰到过,其实核心就是@NotBlank和另外两个注解的“出身”不一样,再加上Wildfly的类加载机制在搞事情,咱们一步步捋清楚:
为啥@NotNull和@Size能用,@NotBlank不行?
首先得明确这几个注解的区别:
@NotNull和@Size是**Bean Validation官方规范(JSR-380)**里的标准注解,Hibernate Validator作为这个规范的实现,天生就支持它们,所以Wildfly自带的Hibernate能直接识别。- 而
@NotBlank是Hibernate Validator自己搞的扩展注解(不属于官方规范),它确实相当于@NotNull + @Size(min=1)的组合,但要让它生效,得满足几个条件才行。
可能的原因和解决办法
1. 你是不是导错注解了?
先检查代码里的导入语句!如果你的@NotBlank是从Spring包里导的(比如org.springframework.validation.annotation.NotBlank),那Hibernate的验证器根本认不出来它——因为Spring的注解得靠Spring的验证上下文来处理。
正确的导入应该是Hibernate Validator的版本:
import org.hibernate.validator.constraints.NotBlank;
2. 依赖冲突搞的鬼
Wildfly 12默认自带的是Hibernate Validator 5.3.x,这个版本是支持@NotBlank的,但如果你的项目里自己引入了其他版本的Hibernate Validator或者Spring Validation依赖,就会和Wildfly自带的版本打架,导致@NotBlank的类没被正确加载。
如果是Maven项目,打开pom.xml,把相关依赖改成provided范围,让Wildfly用它自带的版本:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.6.Final</version> <!-- 和Wildfly12自带版本一致最好 --> <scope>provided</scope> </dependency>
3. 验证器没被正确触发
有时候Hibernate的验证默认只在特定阶段触发,你可以在persistence.xml里加个配置,强制让它在所有实体生命周期阶段都启用验证:
<property name="javax.persistence.validation.mode" value="ALL"/>
这个配置会让Hibernate在保存、更新实体的时候都去检查约束。
4. 手动验证测试下
要是上面的方法都试了还是不行,你可以写个小测试,直接调用验证器看看@NotBlank能不能生效:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); // 实例化你的实体类,给question设为空字符串 YourEntity entity = new YourEntity(); entity.setQuestion(""); Set<ConstraintViolation<YourEntity>> violations = validator.validate(entity); // 遍历输出违反约束的信息 for (ConstraintViolation<YourEntity> violation : violations) { System.out.println("验证失败:" + violation.getMessage()); }
如果这个测试能输出错误信息,说明注解本身是好的,问题出在Wildfly的Hibernate集成配置上;要是没输出,那肯定是依赖或者导入的问题没解决。
内容的提问来源于stack exchange,提问作者user9611351

