java Weblogic 部署原因 - 创建名为“org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0”的 bean 时出错

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14556895/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 16:40:02  来源:igfitidea点击:

Weblogic deployment causes - Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'

javaspringhibernateweblogicjpa-2.0

提问by J?cob

I am using Hibernate 4, Spring 3 , JSF 2.0 and Weblogic 10.3.6

我正在使用 Hibernate 4、Spring 3、JSF 2.0 和 Weblogic 10.3.6

When I start weblogic server and server starts successfully, however whenever it starts publishing application, I am getting the following exception.

当我启动 weblogic 服务器并且服务器成功启动时,但是每当它开始发布应用程序时,我都会收到以下异常。

   Error creating bean with name 
 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' 
  defined in ServletContext resource [/WEB-INF/applicationContext.xml]: 
  Initialization of bean failed; nested exception is 
  org.springframework.beans.factory.BeanCreationException: 

    Caused By: org.springframework.beans.factory.BeanCreationException: Error creating 
   bean with name 'entityManagerFactory'defined in ServletContext resource 
   [/WEB-INF/applicationContext.xml]: Invocation of init method failed; 
   nested exception is java.lang.NoSuchMethodError: 
   javax.persistence.spi.PersistenceUnitInfo.getSharedCacheMode()Ljavax/persistence/
   SharedCacheMode;

Caused By: java.lang.NoSuchMethodError: 
javax.persistence.spi.PersistenceUnitInfo.getSharedCacheMode()
Ljavax/persistence /SharedCacheMode;    at 
org.hibernate.ejb.util.LogHelper.logPersistenceUnitInfo(LogHelper.java:38)  at
org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:525)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:72)     at  org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManage

I have the following in applicationContext.xml

我在 applicationContext.xml 中有以下内容

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">      
    <context:component-scan base-package="net.test" />
    <!-- Data Source Declaration -->
    <bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="oracle.jdbc" />
        <property name="jdbcUrl" value="jdbc:oracle:thin:@server:1521:DB" />
        <property name="user" value="scott" />
        <property name="password" value="tiger" />
        <property name="maxPoolSize" value="10" />
        <property name="maxStatements" value="0" />
        <property name="minPoolSize" value="5" />
    </bean>
    <bean
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    <!-- JPA Entity Manager Factory -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="packagesToScan" value="net.test.entity" />

        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="${jdbc.dialectClass}" />

            </bean>
        </property>
    </bean>
    <bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
    <!-- Session Factory Declaration -->
    <bean id="SessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="annotatedClasses">
            <list>
                <value>net.test.entity.Department</value>
                <value>net.test.entity.Employees</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory
                </prop>
            </props>
        </property>
    </bean>
    <!-- Enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="txManager" />
    <tx:annotation-driven transaction-manager="transactionManager" />
    <!-- Transaction Config -->

    <bean id="txManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="SessionFactory" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <context:annotation-config />    

    <bean id="hibernateStatisticsMBean" class="org.hibernate.jmx.StatisticsService">
        <property name="statisticsEnabled" value="true" />
        <property name="sessionFactory" value="#{entityManagerFactory.sessionFactory}" />
    </bean>
    <bean name="ehCacheManagerMBean"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />

    <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
        <property name="locateExistingServerIfPossible" value="true" />
    </bean>    
    <bean id="jmxExporter" class="org.springframework.jmx.export.MBeanExporter"
        lazy-init="false">
        <property name="server" ref="mbeanServer" />
        <property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING" />
        <property name="beans">
            <map>
                <entry key="SpringBeans:name=hibernateStatisticsMBean"
                    value-ref="hibernateStatisticsMBean" />
                <entry key="SpringBeans:name=ehCacheManagerMBean" value-ref="ehCacheManagerMBean" />
            </map>
        </property>
    </bean>

</beans>

pom.xml

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
          http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.test</groupId>
    <artifactId>myappp</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version> 
    <name>myappp</name> 
    <url>http://maven.apache.org</url>
    <repositories>
        <repository>
            <id>prime-repo</id>
            <name>PrimeFaces Maven Repository</name>
            <url>http://repository.primefaces.org</url>
            <layout>default</layout>
        </repository>
    </repositories>
    <properties>
        <spring.version>3.1.1.RELEASE</spring.version>
    </properties>
    <dependencies>
        <!-- Spring 3 dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- JSF library -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- Primefaces library -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces.themes</groupId>
            <artifactId>afterwork</artifactId>
            <version>1.0.8</version>
        </dependency>
        <!-- Hibernate library -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency>
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>
        <!-- Oracle Java Connector library -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.3</version>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <!-- Log4j library -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.4</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>1.2.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>
        <dependency>
    <groupId>org.apache.myfaces.extensions.cdi.core</groupId>
    <artifactId>myfaces-extcdi-core-api</artifactId>
    <version>1.0.5</version>
    <scope>compile</scope>
</dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>4.0.1.Final</version>
        </dependency>       
    </dependencies> 
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>              
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-proc:none</compilerArgument>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.bsc.maven</groupId>
                <artifactId>maven-processor-plugin</artifactId>
                <version>2.0.6</version>
                <executions>
                    <execution>
                        <id>process</id>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <phase>generate-sources</phase>
                        <configuration>
                            <!-- source output directory -->
                            <outputDirectory>target/metamodel</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

In Weblogic 10.3.6 I have enabled JPA2 support by adding the following in commEnv.cmd

在 Weblogic 10.3.6 中,我通过添加以下内容启用了 JPA2 支持 commEnv.cmd

@rem Enable JPA 2.0 functionality on WebLogic Server 
set PRE_CLASSPATH=%BEA_HOME%\modules\javax.persistence_1.1.0.0_2-0.jar;
%BEA_HOME%\modules\com.oracle.jpa2support_1.0.0.0_2-1.jar

How can I resolve this error?

我该如何解决这个错误?

采纳答案by J?cob

This issue has been resolved, for Weblogic 10.3.6 exe distribution there is no javax.persistence_1.0.0.0_2-0-0.jar, what it has is javax.persistence_1.1.0.0_2-0.jar.

此问题已得到解决,对于WebLogic 10.3.6 EXE分布不存在javax.persistence_1.0.0.0_2-0-0.jar,它有什么是javax.persistence_1.1.0.0_2-0.jar

That class along with jpa2support_1.0.0.0_2-0.jarneeds to be in classpath.

该类以及jpa2support_1.0.0.0_2-0.jar需要在类路径中。

Thanks

谢谢

回答by Apostolos Emmanouilidis

Maybe the problem is related to the classloading hierarchy and some classes are loaded from the system class loader rather than the jars included in your EAR.

也许问题与类加载层次结构有关,并且某些类是从系统类加载器而不是 EAR 中包含的 jar 加载的。

In WebLogicServer, any .jar file present in the system classpathis loaded by the WebLogic Server system classloader. All applications running within a server instance are loaded in application classloaders which are children of the system classloader. In this implementation of the system classloader, applications cannot use different versions of third-party jars which are already present in the system classloader. Every child classloader asks the parent (the system classloader) for a particular class and cannot load classes which are seen by the parent.

WebLogicServer 中,系统类路径中存在的任何 .jar 文件都由 WebLogic Server系统类加载器加载。在服务器实例中运行的所有应用程序都加载到应用程序类加载器中,这些应用程序类加载器是系统类加载器的子项。在系统类加载器的这个实现中,应用程序不能使用系统类加载器中已经存在的第三方 jar 的不同版本。每个子类加载器都向父类(系统类加载器)询问特定的类,并且无法加载父类看到的类。

For example, if a class called com.foo.Baz exists in both $CLASSPATH as well as the application EAR, then the class from the $CLASSPATH is loaded and not the one from the EAR. Since weblogic.jar is in the $CLASSPATH, applications can not override any WebLogic Server classes.

例如,如果 $CLASSPATH 和应用程序 EAR 中都存在一个名为 com.foo.Baz 的类,则加载 $CLASSPATH 中的类,而不是 EAR 中的类。由于 weblogic.jar 在 $CLASSPATH 中,应用程序不能覆盖任何 WebLogic Server 类。

The FilteringClassLoaderprovides a mechanism for you to configure deployment descriptors to explicitly specify that certain packages should always be loaded from the application, rather than being loaded by the system classloader.

FilteringClassLoader提供了一种机制,方便用户配置部署描述符来明确指定特定的包应始终从应用程序中加载,而不是由系统类加载器加载。

The FilteringClassLoadersits between the application classloader and the system. It is a child of the system classloader and the parent of the application classloader. The FilteringClassLoader intercepts the loadClass(String className) method and compares the className with a list of packages specified in weblogic-application.xmlfile.

FilteringClassLoader位于应用程序的类加载器和系统之间。它是系统类加载器的子类和应用程序类加载器的父类。FilteringClassLoader 拦截 loadClass(String className) 方法并将 className 与weblogic-application.xml文件中指定的包列表进行比较。

In conclusion would you try to modify your weblogic-application.xml as to load some packages from the jars included in your EAR rather than the system class loader? A sample example is the following:

总之,您会尝试修改 weblogic-application.xml 以从 EAR 中包含的 jars 而不是系统类加载器加载一些包吗?示例示例如下:

<prefer-application-packages>
    <package-name>antlr.*</package-name>
    <package-name>org.apache.commons.*</package-name>
    <package-name>org.apache.xmlbeans.*</package-name>
    <package-name>org.springframework.*</package-name>
    <package-name>org.hibernate.*</package-name>
    <package-name>javax.persistence.*</package-name>
</prefer-application-packages>