spring validator校验在服务器不生效的问题

  1. 这个问题比较诡异,在我本地能进行校验逻辑判断,放在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);
    }
}
  1. 当然了还有个问题所在,就是为什么两个环境this.validator的实现类不同,这有待考究
  2. 最后如果强制设置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

这样就很容易发现问题所在了,缺少相关依赖


org.glassfish
javax.el
3.0.1-b08

  1. 最后附上一个链接,对于相关环境也会有所影响,当然在我现有环境没有这样的问题,这也算归总下吧
    http://hibernate.org/validator/documentation/getting-started/

你可能感兴趣的:(spring validator校验在服务器不生效的问题)