最近使用hibernate-validator校验请求信息中不符合接口规范的参数
maven如下:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
<scope>compile</scope>
</dependency>
自测时发现,只有@NotNull注解的参数可以校验,其余注解(例如:@NotBlank、@NotEmpty)都无效,很是费解
最后发现,是项目中某一模块依赖了bval-jsr
<dependency>
<groupId>org.apache.bval</groupId>
<artifactId>bval-jsr</artifactId>
<version>1.1.2</version>
</dependency>
如果依赖了bval-jsr,则在获取验证器构建对象时
Validation.buildDefaultValidatorFactory().getValidator();
该方法可能生成的对象是下面这个
\org\apache\bval\bval-jsr\1.1.2\bval-jsr-1.1.2.jar!
\org\apache\bval\jsr\ApacheValidatorFactory.class
(该对象用来校验xml格式的参数)
而不是预期的下面这个对象
\org\hibernate\validator\hibernate-validator\6.1.5.Final\hibernate-validator-6.1.5.Final.jar!
\org\hibernate\validator\internal\engine\ValidatorFactoryImpl.class
因此校验模块不能有bval-jsr包的依赖,需要排除
<exclusions>
<exclusion>
<groupId>org.apache.bval</groupId>
<artifactId>bval-jsr</artifactId>
</exclusion>
</exclusions>
完美解决