Weblogic 12c HibernateValidator ClassLoading问题

时间:2014-03-05 19:27:41

标签: weblogic classloader classcastexception hibernate-validator

验证框架已作为JEE6规范(WL12)的一部分汇总而成。我们的应用程序的WL10和WL12版本都使用以下开源库进行部署:

  1. JSR-303 / validation-api.jar(版本1.0)
  2. Hibernate Validator(版本4.2.0)
  3. 但是,这些库也与WL 12(模块目录)捆绑在一起。请注意,Hibernate Validator版本略有不同。

    1. modules.javax.validation_1.0.0.jar
    2. hibernate.validator_4.1.0.jar
    3. 随着我们的WL12运行,我们将获得以下异常:

      javax.validation.ValidationException: Unable to get available provider 
      

      尝试过的解决方案 我们的下一个尝试是使用WebLogic FilteringClassLoader来优先选择我们的应用程序(APP-INF / lib目录)中的库,方法是在weblogic-application.xml文件中指定它们(即通过WebLogic选择我们的版本)。我们已经为WL10中的其他几个开源库做了这个:

      <prefer-application-packages>
        <package-name>com.google.common.*</package-name>    
        <package-name>org.apache.commons.lang.*</package-name>
        <package-name>org.apache.commons.logging.*</package-name>
        <package-name>org.apache.commons.beanutils.*</package-name>
        <package-name>org.apache.commons.collections.*</package-name>
        <package-name>antlr.*</package-name>
        <package-name>javax.validation.*</package-name>
        <package-name>org.hibernate.validator.*</package-name>
      </prefer-application-packages>
      

      进行此更改后,我们的应用程序遇到以下运行时错误,尝试处理使用验证框架的任何请求:

      javax.validation.ValidationException: Unable to get available provider resolvers.
          at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:259)
          at web20.hibernate.validation.ValidatorFactoryConfigurator.getValidatorFactory(ValidatorFactoryConfigurator.java:39)
          at web20.hibernate.validation.ValidationHandlerImpl.handleHibernateValidations(ValidationHandlerImpl.java:180)
          at web20.hibernate.validation.ValidationHandlerImpl.performValidation(ValidationHandlerImpl.java:255)
          at web20.hibernate.validation.ValidationHandlerImpl.validateAndFormatMessages(ValidationHandlerImpl.java:302)
          at web20.hibernate.validation.ValidationHandlerImpl.validateUsingHibernateGroups(ValidationHandlerImpl.java:113)
          at service.serviceapp.performValidations(serviceapp.java:392)
          at service.serviceapp.performValidations(serviceapp.java:379)
          at service.TransactionalServiceImpl.search(TransactionalServiceImpl.java:300)
      

1 个答案:

答案 0 :(得分:0)

鉴于Bean Validation是EE标准的一部分,我假设有一些代码Bean Validation集成代码会导致问题。我看到两个可能的解决方案:

  • 修补WL实例并升级到您要使用的Validator版本
  • 尝试编写自己的ValidationProvider。在内部,它可以委托给Hibernate Validator类。然后,如果您在应用程序中添加 validation.xml ,指定自定义提供程序,则WL应该引导此提供程序。 TBH,我不知道这是否有效。有很多未知数,我对WL和Bean验证的集成还不太了解。

就个人而言,我想我会尝试升级WL中使用的Validator版本。