Weblogic 12c JPA 2.1 spring 启动
Weblogic 12c JPA 2.1 spring boot
我想将 spring 启动应用程序部署到 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.next(ModuleStateDriver.java:216)
at weblogic.application.internal.flow.ModuleStateDriver.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)
谢谢
我想回答你的问题有点太晚了,但听起来你正在使用新的接口和旧的实现。例如,当您部署到容器而不使用 class-path 过滤时,有时会发生这种情况。反过来,您将使用容器提供的旧实现。该行为非常随机,具体取决于何时加载内容。希望这可以帮助您朝着正确的方向前进,或者帮助其他任何遇到类似问题的人。
显然,API 和实现 (eclipse.jpa.PersistenceProvider) 之间存在类加载冲突。
然而,这种冲突的原因尚未解释,因为 'prefer-application-packages' 应该告诉容器使用应用程序包中的内容(即 API 和实现) .
在 WLS 12.2.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>
确保 weblogic.xml 中的 'prefer-application-packages' 不 包含 javax.persistence.*(但应包含 javax.validation.* 和 org.hibernate.*)
使用此解决方法,您依赖于容器的 JPA2 实现。
请注意,如果版本不同,这可能会造成混淆,因为单元测试(使用 Spring Boot 附带的 JPA2 实现:hibernate-jpa)和容器中的测试(使用任何东西)之间的行为可能不同JPA 实现 WebLogic 提供:可能是 eclipse JPA Provider)。
我在 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>
抱歉我迟到了。我的最终解决方案:
将 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>
这对我有用...
我想将 spring 启动应用程序部署到 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.next(ModuleStateDriver.java:216)
at weblogic.application.internal.flow.ModuleStateDriver.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)
谢谢
我想回答你的问题有点太晚了,但听起来你正在使用新的接口和旧的实现。例如,当您部署到容器而不使用 class-path 过滤时,有时会发生这种情况。反过来,您将使用容器提供的旧实现。该行为非常随机,具体取决于何时加载内容。希望这可以帮助您朝着正确的方向前进,或者帮助其他任何遇到类似问题的人。
显然,API 和实现 (eclipse.jpa.PersistenceProvider) 之间存在类加载冲突。
然而,这种冲突的原因尚未解释,因为 'prefer-application-packages' 应该告诉容器使用应用程序包中的内容(即 API 和实现) .
在 WLS 12.2.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>
确保 weblogic.xml 中的 'prefer-application-packages' 不 包含 javax.persistence.*(但应包含 javax.validation.* 和 org.hibernate.*)
使用此解决方法,您依赖于容器的 JPA2 实现。
请注意,如果版本不同,这可能会造成混淆,因为单元测试(使用 Spring Boot 附带的 JPA2 实现:hibernate-jpa)和容器中的测试(使用任何东西)之间的行为可能不同JPA 实现 WebLogic 提供:可能是 eclipse JPA Provider)。
我在 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>
抱歉我迟到了。我的最终解决方案:
将 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>
这对我有用...