Java Weblogic 12c JPA 2.1弹簧引导

Java Weblogic 12c JPA 2.1弹簧引导,java,spring,hibernate,jpa,weblogic,Java,Spring,Hibernate,Jpa,Weblogic,我想在WebLogic12c(12.1.2)上部署一个spring引导应用程序 使用最新spring引导库的应用程序。我尝试使用更喜欢web inf类,但我运气不佳 如果我尝试使用我得到的首选webinf类(我的应用程序使用的是验证api 1.1.0.Final): weblogic.application.ModuleException:java.lang.NoSuchMethodError:javax.validation.spi.ConfigurationState.getParamete

我想在WebLogic12c(12.1.2)上部署一个spring引导应用程序

使用最新spring引导库的应用程序。我尝试使用
更喜欢web inf类
,但我运气不佳

如果我尝试使用我得到的
首选webinf类
(我的应用程序使用的是验证api 1.1.0.Final):

weblogic.application.ModuleException:java.lang.NoSuchMethodError:javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
位于weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
在weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
位于weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:216)
位于weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:211)
位于weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
截断的。有关完整的堆栈跟踪,请参阅日志文件
原因:java.lang.NoSuchMethodError:javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
位于org.hibernate.validator.internal.engine.validatoryImpl.(validatoryImpl.java:142)
位于org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:35)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
截断的。有关完整的堆栈跟踪,请参阅日志文件
如果我尝试在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>

antlr*
org.apache.commons*
org.apache.xmlbeans*
org.springframework*
org.hibernate*
org.hibernate.validator*
javax.validation*
javax.persistence*
javax.validation.spi*
org.slf4j*
org.joda*
com.fasterxml*
我从验证器中得到
hibernate weblogic“org.eclipse.persistence.jpa.PersistenceProvider不能转换为javax.persistence.spi.PersistenceProvider”
异常

我怎样才能解决这个问题?(升级weblogic不是一个选项)


谢谢

我想回答您的问题有点晚了,但听起来您使用的是新接口和旧实现。例如,当您部署到容器而不使用类路径筛选时,有时会发生这种情况。反过来,您将使用容器提供的旧实现。行为是非常随机的,这取决于加载时加载的内容。希望这能帮助你朝着正确的方向前进,或者帮助其他有类似问题的人

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

然而,这种冲突的原因尚未解释,因为“首选应用程序包”应该告诉容器使用应用程序包中的内容(即API和实现)

在WLS12.2.1中对我有效的解决方法如下:

  • 排除对JAP2 API的依赖关系:

    
    org.springframework.boot
    spring引导启动器数据jpa
    org.hibernate.javax.persistence
    hibernate-jpa-2.1-api
    
  • 确保weblogic.xml中的“首选应用程序包”不包含javax.persistence.*(但应包含javax.validation.*和org.hibernate.*)

  • 使用此解决方案,您将依赖容器的JPA2实现


    注意,我想,如果版本不同,这可能会令人困惑,因为单元测试(使用Spring Boot附带的JPA2实现:hibernate jpa)和容器中的测试(使用WebLogic提供的jpa实现:可能是eclipse jpa提供程序)之间的行为可能不同

    我对Spring Boot和WebLogic 12c也有同样的问题,但有错误
    org.eclipse.persistence.jpa.PersistenceProvider不能转换为javax.persistence.spi.PersistenceProvider

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

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

        <prefer-application-resources>
            <resource-name>META-INF/services/javax.persistence.spi.PersistenceProvider</resource-name>
        </prefer-application-resources>
    
    
    META-INF/services/javax.persistence.spi.PersistenceProvider
    
    很抱歉我回答晚了。我的最终解决方案:

  • 使用以下内容将weblogic.xml添加到war中:

    <?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>
    
    
    真的
    
  • 创建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>
    
    
    org.slf4j*
    com.fasterxml*
    org.joda*
    org.hibernate*
    org.jboss*
    javax.validation*
    

  • 这对我来说很有用…

    你能用-verbose:class启动你的服务器并检查.out文件中的堆栈跟踪,看看它是否被调用。谢谢,我会试试这个。我没有用eclipselink。我认为weblogic提供了这个库,但我不明白为什么不选择web inf或应用程序包来覆盖wls提供的库……谢谢,我忘了删除
    javax.persistence.*
    您可能在github上有某种示例项目吗?谢谢,谢谢,谢谢!关于如何解决这个问题,有很多建议,但只有这个有效。你救了我一天,如果可以的话,我会投上一百票。
    <?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>
    
    <?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>