Weblogic 12c JPA 2.1 spring boot

时间:2016-03-09 14:33:37

标签: java spring hibernate jpa weblogic

我想将一个spring boot应用程序部署到weblogic 12c(12.1.2)。

使用最新spring引导库的应用程序。我尝试使用prefer-web-inf-classes但我运气不好。

如果我尝试使用prefer-webinf-classes我得到了(我的应用程序使用验证api 1.1.0.Final):

weblogic.application.ModuleException: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
        at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
        at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
        at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:216)
        at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:211)
        at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
        Truncated. see log file for complete stacktrace
Caused By: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
        at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:142)
        at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:35)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        Truncated. see log file for complete stacktrace

如果我尝试在web.xml中使用此配置:

    <wls:prefer-application-packages>
        <wls:package-name>antlr.*</wls:package-name>
        <wls:package-name>org.apache.commons.*</wls:package-name>
        <wls:package-name>org.apache.xmlbeans.*</wls:package-name>
        <wls:package-name>org.springframework.*</wls:package-name>
        <wls:package-name>org.hibernate.*</wls:package-name>
        <wls:package-name>org.hibernate.validator.*</wls:package-name>
        <wls:package-name>javax.validation.*</wls:package-name>
        <wls:package-name>javax.persistence.*</wls:package-name>
        <wls:package-name>javax.validation.spi.*</wls:package-name>
        <wls:package-name>org.slf4j.*</wls:package-name>
        <wls:package-name>org.joda.*</wls:package-name>
        <wls:package-name>com.fasterxml.*</wls:package-name>
    </wls:prefer-application-packages>

我从验证者那里得到hibernate weblogic "org.eclipse.persistence.jpa.PersistenceProvider cannot be cast to javax.persistence.spi.PersistenceProvider"例外。

我该如何解决这个问题? (升级weblogic不是一个选项)

由于

4 个答案:

答案 0 :(得分:3)

对不起我迟到的回答。我的最终解决方案:

  1. 使用以下内容将weblogic.xml添加到您的战争中:

    <?xml version="1.0" encoding="UTF-8"?>
    <wls:weblogic-web-app
        xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
        http://xmlns.oracle.com/weblogic/weblogic-web-app
        http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
    <wls:container-descriptor>
        <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
    </wls:container-descriptor>
    </wls:weblogic-web-app>
    
  2. 创建ear(这很重要)并添加weblogic-application.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application
        http://xmlns.oracle.com/weblogic/weblogic-application/1.4/weblogic-application.xsd">
    <prefer-application-packages>
        <package-name>org.slf4j.*</package-name>
        <package-name>com.fasterxml.*</package-name>
        <package-name>org.joda.*</package-name>
        <package-name>org.hibernate.*</package-name>
        <package-name>org.jboss.*</package-name>
        <package-name>javax.validation.*</package-name>
    </prefer-application-packages>
    </weblogic-application>
    
  3. 这对我有用......

答案 1 :(得分:2)

我遇到了与Spring Boot和WebLogic 12c相同的错误问题 org.eclipse.persistence.jpa.PersistenceProvider cannot be cast to javax.persistence.spi.PersistenceProvider

只有在我使用任何验证注释时才会出现此错误。

通过将此添加到weblogic.xml解决:

    <prefer-application-resources>
        <resource-name>META-INF/services/javax.persistence.spi.PersistenceProvider</resource-name>
    </prefer-application-resources>

答案 2 :(得分:1)

显然,API和实现之间存在类加载冲突(eclipse.jpa.PersistenceProvider)。

然而,这种冲突的原因尚未解释,因为'prefer-application-packages'应该告诉容器使用应用程序包中的内容(即API和实现)。

在WLS 12.2.1 中对我有用的解决方法如下:

  1. 排除对JAP2 API的依赖关系:

    <dependency>  
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
      <exclusions>
          <exclusion>
              <groupId>org.hibernate.javax.persistence</groupId>
              <artifactId>hibernate-jpa-2.1-api</artifactId>
          </exclusion>
      </exclusions>
    </dependency>
    
  2. 确保weblogic.xml中的'prefer-application-packages'包含javax.persistence。*(但应包括javax.validation。*和org.hibernate。 *)

  3. 使用此解决方法,您依赖于容器的JPA2实现..

    请注意,如果版本不同,这可能会造成混淆,因为单元测试(使用Spring Boot:hibernate-jpa附带的JPA2实现)和容器中的测试之间的行为可能不同(使用WebLogic提供的任何JPA实现:可能eclipse JPA Provider)。

答案 3 :(得分:0)

我猜这个问题有点太迟了,但听起来好像你正在使用一个新的界面和旧的实现。例如,当您部署到容器而不使用类路径筛选时,有时会发生这种情况。反过来,您将使用容器提供的旧实现。行为非常随机,具体取决于何时加载。希望这可以帮助您朝着正确的方向或任何有类似问题的人。