- 这个问题比较诡异,在我本地能进行校验逻辑判断,放在QA环境就不行,其实最开始我一直在想配置的问题。google了大半天,也没发现有相同的情况。好在可以通过远程debug的方式定位问题,最后发现ConfigurableWebBindingInitializer类中initBinder绑定Validator的时候不满足条件,所以未绑定上,这个时候我对比本地环境,发现this.validator的实现类不同,本地是LocalValidatorFactoryBean,QA是OptionalValidatorFactoryBean。两者关系(OptionalValidatorFactoryBean extends LocalValidatorFactoryBean)。最后debug的时候发现执行LocalValidatorFactoryBean.afterPropertiesSet()方法时,
// Try Hibernate Validator 5.2's externalClassLoader(ClassLoader) method
if (this.applicationContext != null) {
try {
Method eclMethod = configuration.getClass().getMethod("externalClassLoader", ClassLoader.class);
ReflectionUtils.invokeMethod(eclMethod, configuration, this.applicationContext.getClassLoader());
}
catch (NoSuchMethodException ex) {
// Ignore - no Hibernate Validator 5.2+ or similar provider
}
}
这里抛出异常了,但是恰恰的是,这异常被catch时输出日志级别是debug,而不是正常的error级别日志。这个时候QA环境配置的日志级别是info,所以这根本发现不了问题所在。
附上子类捕获异常的代码:
@Override
public void afterPropertiesSet() {
try {
super.afterPropertiesSet();
}
catch (ValidationException ex) {
LogFactory.getLog(getClass()).debug("Failed to set up a Bean Validation provider", ex);
}
}
- 当然了还有个问题所在,就是为什么两个环境this.validator的实现类不同,这有待考究
- 最后如果强制设置this.validator的实现类为LocalValidatorFactoryBean,在spring初始化bean的时候就会显示抛出该异常
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'commonValidator' defined in class path resource [springmvc.xml]: Invocation of init method failed; nested exception is javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
这样就很容易发现问题所在了,缺少相关依赖
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
- 最后附上一个链接,对于相关环境也会有所影响,当然在我现有环境没有这样的问题,这也算归总下吧
http://hibernate.org/validator/documentation/getting-started/
网友评论