美文网首页
spring validator校验在服务器不生效的问题

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

作者: smallAttr | 来源:发表于2018-08-22 11:54 被阅读0次
    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

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

    <dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b08</version>
    </dependency>

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

    相关文章

      网友评论

          本文标题:spring validator校验在服务器不生效的问题

          本文链接:https://www.haomeiwen.com/subject/beieiftx.html