Невозможно перенести файл WAR из Tomcat в Glassfish. Ошибка RESOURCE_LOCAL по сравнению с JTA

Я пытаюсь взять WAR, который отлично развертывается и работает на Tomcat, и развернуть его на Glassfish. Первоначальное сообщение об ошибке в Glassfish:

com.sun.enterprise.deployment.backend.IASDeploymentException: ошибка развертывания - имя-ссылки-контекста сохранения [org.nhindirect.config.store.dao.impl.AnchorDaoImpl / entityManager] в модуле [C: \ Sun \ AppServer \ domains \ domain1 \ applications \ j2ee-modules \ config-service] преобразуется в блок сохранения состояния, называемый [config-store], который имеет тип RESOURCE_LOCAL. Только единицы сохраняемости с типом транзакции JTA могут использоваться в качестве диспетчера управляемого объекта контейнера. Пожалуйста, подтвердите вашу заявку.

WAR не имеет файла persistence.xml в папке META-INF. Однако в WEB-INF \ lib есть файл JAR, который сам содержит файл persistence.xml. Ниже приводится его содержание:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
                        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="config-store" transaction-type="RESOURCE_LOCAL">
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>
</persistence>

Итак, вот мой вопрос: можно ли запустить WAR, настроенный для RESOURCE_LOCAL на Glassfish, или я должен перенастроить WAR для JTA?

Я исследовал первый вариант, внося следующие изменения в файл WAR web.xml:

  1. Изменено xmlns="http://java.sun.com/xml/ns/javaee"
    на
    xmlns="http://java.sun.com/xml/ns/j2ee"
  2. Изменено xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    на
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  3. Где-то в вашем коде вы, вероятно, вставляете
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
                            http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
        version="1.0">
        <persistence-unit name="config-store" transaction-type="RESOURCE_LOCAL">
            <properties>
                <property name="hibernate.hbm2ddl.auto" value="validate" />
            </properties>
        </persistence-unit>
    </persistence>
    
    , используя код, который выглядит примерно так:

После этих изменений казалось, что WAR развернут успешно, однако я не смог получить доступ к его WSDL, и в журнале Glassfish была обнаружена следующая ошибка:

Часть приведенного выше сообщения об ошибке жалуется на javassist. Это кажется странным, потому что следующий раздел находится в файле WAR pom.xml.

Если полезно, вот содержимое файла beans.xml WAR:

<dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.1.GA</version>
</dependency>

Извините, если я предоставил слишком много информации. Я новичок в JPA и не был уверен, что никому поможет, а что нет.

<?xml version="1.0" encoding="UTF-8"?>
<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"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/tx       http://www.springframework.org/schema/tx/spring-tx.xsd
    http://cxf.apache.org/jaxws                    http://cxf.apache.org/schemas/jaxws.xsd" 
    default-autowire="byName">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <context:annotation-config />
    <context:component-scan base-package="org.nhindirect.config" />
    <tx:annotation-driven transaction-manager="transactionManager" />

    <jaxws:endpoint id="configurationService"
                 address="/ConfigurationService" >
        <jaxws:implementor>
            <bean id="configurationServiceImpl" 
                  class="org.nhindirect.config.service.impl.ConfigurationServiceImpl">
                  <property name="domainSvc" ref="domainSvc"/>
                  <property name="addressSvc" ref="addressSvc"/>
                  <property name="anchorSvc" ref="anchorSvc"/>
                  <property name="certSvc" ref="certSvc"/>
                  <property name="settingSvc" ref="settingSvc"/>
                  <property name="DNSSvc" ref="dnsSvc"/>
            </bean>

        </jaxws:implementor>
    </jaxws:endpoint>

    <!-- <jaxws:endpoint id="addressService" implementor="org.nhindirect.config.service.ws.AddressServiceWS" 
        address="/AddressService" /> -->

    <!--  Service Implementations -->
    <bean id="domainSvc" class="org.nhindirect.config.service.impl.DomainServiceImpl">
       <property name="dao" ref="domainDao"/>
    </bean>
    <bean id="addressSvc" class="org.nhindirect.config.service.impl.AddressServiceImpl">
       <property name="dao" ref="addressDao"/>
    </bean>
    <bean id="anchorSvc" class="org.nhindirect.config.service.impl.AnchorServiceImpl">
       <property name="dao" ref="anchorDao"/>
    </bean>
    <bean id="certSvc" class="org.nhindirect.config.service.impl.CertificateServiceImpl">
       <property name="dao" ref="certificateDao"/>
    </bean>
    <bean id="settingSvc" class="org.nhindirect.config.service.impl.SettingServiceImpl">
       <property name="dao" ref="settingDao"/>
    </bean>
    <bean id="dnsSvc" class="org.nhindirect.config.service.impl.DNSServiceImpl">
       <property name="dao" ref="dnsDao"/>
    </bean> 

    <!--  DAO's -->
    <bean id="domainDao" class="org.nhindirect.config.store.dao.impl.DomainDaoImpl"/>
    <bean id="addressDao" class="org.nhindirect.config.store.dao.impl.AddressDaoImpl"/>
    <bean id="anchorDao" class="org.nhindirect.config.store.dao.impl.AnchorDaoImpl" />
    <bean id="certificateDao" class="org.nhindirect.config.store.dao.impl.CertificateDaoImpl"/>
    <bean id="settingDao" class="org.nhindirect.config.store.dao.impl.SettingDaoImpl"/> 
    <bean id="dnsDao" class="org.nhindirect.config.store.dao.impl.DNSDaoImpl"/> 

    <!-- Exception translation bean post processor -->
    <bean
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<!-- SWAP THIS JPA IMPLEMENTATION WITH THE APPROPROATE DB CONFIGURATION
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
            </bean>
        </property>
        <property name="persistenceUnitName" value="config-store" />
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql:nhindconfig" />
        <property name="username" value="nhind" />
        <property name="password" value="nhind" />
    </bean>
-->

<!-- EMBEDDED DERBY JPA CONFIGURATION FOR A WORKING OUT OF THE BOX CONFIGURATION WITH NO PREREQUISITES OF
     SETTING UP AN EXTERNAL DATABASE.  REMOVE THIS SECTION AND REPLACE WITH READ JPA CONFIGURATION (SEE
     ABOVE SECTION) FOR PRODUCTION -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <!--  <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" /> -->
                <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect" />
            </bean>
        </property>
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceUnitName" value="config-store" />
    </bean> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
        <property name="url" value="jdbc:derby:nhindconfig;create=true" />
        <property name="username" value="nhind" />
        <property name="password" value="nhind" />
    </bean>     
<!--  END DERBY JPA CONFIGURATION -->

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />

</beans>

Заранее спасибо.

Изменено version="2.5" на version="2.4"


person Vanessa    schedule 22.03.2011    source источник


Ответы (1)


В этой ситуации вы просите контейнер (сам Glassfish, чтобы создать EntityManager и управлять им. Glassfish является кластеризованным, пытается защитить вас от случайного выполнения транзакции на нескольких серверах, которая не является действительно ACID, но требует, чтобы вы использовали JTA-транзакция (которая может использоваться несколькими кластерными серверами).

@PersistanceContext    // Requires JTA
EntityManager em;

Если вы точно знаете, что НИКОГДА не собираетесь кластеризовать контейнер Glassfish для этого приложения, вы можете безопасно продолжать использовать транзакции RESOURCE_LOCAL, однако Glassfish не сможет управлять этим EntityManager за вас. Вы можете заставить Glassfish управлять EntityManagerFactory.

Это безопасно использовать для единиц устойчивости RESOURCE_LOCAL. Вам просто нужно запросить EntityManager с завода, используя factory.createEntityManager().

@PersistanceUnit    // Does NOT require JTA
EntityManagerFactory factory;

Теперь ваш EntityManager управляется приложением, а не контейнером. Итак, Glassfish предполагает, что вы будете обрабатывать изоляцию транзакций в кластере.

Исключительная ситуация, отправляющая инициализированное событие контекста экземпляру прослушивателя класса org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'org.springframework.dao.annotation.PersistenceExceptionTranslationPosttext ресурс [/WEB-INF/beans.xml]: инициализация bean-компонента не удалась; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'entityManagerFactory', определенным в ресурсе ServletContext [/WEB-INF/beans.xml]: не удалось вызвать метод инициализации; вложенное исключение - это java.lang.NoClassDefFoundError: javassist / bytecode / ClassFile в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean ($ AbstractAutowireCaputoableBeanwork.Android). (AbstractAutowireCapableBeanFactory.java:409) в java.security.AccessController.doPrivileged (собственный метод) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.createBean (AbstractAutowire) .AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:264) по адресу org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) по адресу org.springframework. java: 261) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (Abstrac tBeanFactory.java:185) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:164) в org.springframework.context.support.AbstractApplicationContext.javaBeanText (atbject) .context.support.AbstractApplicationContext.registerBeanPostProcessors (AbstractApplicationContext.java:596) в org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:365) в контексте org.springframework.context.support. : 255) в org.springframework.web.context.ContextLoader.initWebApplicationContext (ContextLoader.java:199) в org.springframework.web.context.ContextLoaderListener.contextInitialized (ContextLoaderListener.java:45) в org. StandardContext.listenerStart (StandardContext.java:4655) в org.apache.catalina.core.StandardContext.start (StandardContext.java:5364) в com.sun.enterprise.web.WebModule.start (WebModule.java:345) в org .apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java:986) в org.apache.catalina.core.ContainerBase.addChild (ContainerBase.java:970) в org.apache.catalina.core.StandardHost.addChild (StandardHost.addChild .java: 704) на com.sun.enterprise.web.WebContainer.loadWebModule (WebContainer.java:1649) на com.sun.enterprise.web.WebContainer.loadWebModule (WebContainer.java:1254) на com.sun.enterprise. server.WebModuleDeployEventListener.moduleDeployed (WebModuleDeployEventListener.java:182) в com.sun.enterprise.server.WebModuleDeployEventListener.moduleDeployed (WebModuleDeployEventListener.moduleDeployed (WebModuleDeployEventListener.moduleDeployed: 1005) на com.sun.enterprise.admin.ev ent.AdminEventMulticaster.handleModuleDeployEvent (AdminEventMulticaster.java:992) в com.sun.enterprise.admin.event.AdminEventMulticaster.processEvent (AdminEventMulticaster.java:470) в com.sun.enterprise.adminventEvent.Admin. java: 182) на com.sun.enterprise.admin.server.core.DeploymentNotificationHelper.multicastEvent (DeploymentNotificationHelper.java:308) на com.sun.enterprise.deployment.phasing.DeploymentServiceUtils.multicastEvent (DeploymentServiceUtils) atjava: .sun.enterprise.deployment.phasing.ServerDeploymentTarget.sendStartEvent (ServerDeploymentTarget.java:298) в com.sun.enterprise.deployment.phasing.ApplicationStartPhase.runPhase (ApplicationStartPhase.java:132) at com.sun.ployment. .DeploymentPhase.executePhase (DeploymentPhase.java:108) на com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases (PEDeploymentService.java:966) на com.sun.enterprise.depl oyment.phasing.PEDeploymentService.start (PEDeploymentService.java:609) в com.sun.enterprise.deployment.phasing.PEDeploymentService.start (PEDeploymentService.java:653) в com.sun.enterprise.admin.mbeans.Applications.start ApplicationsConfigMBean.java:773) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingImpl.java:39) в sun.reflect.DelegatingImpl.java.invoke: .lang.reflect. Method.invoke (Method.java:597) на com.sun.enterprise.admin.MBeanHelper.invokeOperationInBean (MBeanHelper.java:390) на com.sun.enterprise.admin.MBeanHelper.invokeOperationInBean (MBeanHelper.java) .sun.enterprise.admin.config.BaseConfigMBean.invoke (BaseConfigMBean.java:477) в com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke (DefaultMBeanServerInterceptor.java:836) в com.sunkeepserver.java: (JmxMBeanServer.java:761) в sun.reflect.GeneratedMethodAccessor13.invoke (Неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.invoke ) в com.sun.enterprise.admin.util.proxy.ProxyClass.invoke (ProxyClass.java:90) в $ Proxy1.invoke (Неизвестный источник) в com.sun.enterprise.admin.server.core.jmx.SunoneInterceptor. invoke (SunoneInterceptor.java:304) в com.sun.enterprise.interceptor.DynamicInterceptor.invoke (DynamicInterceptor.jav a: 170) на com.sun.enterprise.deployment.client.DeploymentClientUtils.startApplication (DeploymentClientUtils.java:159) на com.sun.enterprise.deployment.client.DeployAction.run (DeployAction.java:538) на java.lang .Thread.run (Thread.java:619) Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем entityManagerFactory, определенным в ресурсе ServletContext [/WEB-INF/beans.xml]: вызов инициализации метод не удался; вложенное исключение - это java.lang.NoClassDefFoundError: javassist / bytecode / ClassFile в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCaputoableBeanFoundError. AbstractAutowireCapableBeanFactory.java:473) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory $ 1.run (AbstractAutowireCapableBeanFactory.java:409) в java.security.doativeController.framework.doativeController.java.security. .AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:380) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactoryBeanFactory. java: 222) в org.springframework.beans.factory.support . AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:261) по адресу org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:185) по адресу org.springframework.beans. 164) в org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType (DefaultListableBeanFactory.java:308) в org.springframework.beans.factory.BeanFactoryUtils.beanFramework.framework.including () .PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators (PersistenceExceptionTranslationInterceptor.java:122) в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor. (PersistenceExceptionTranslationExceptionTranslationInterceptor. springframework.dao.annotation.Per sistenceExceptionTranslationPostProcessor.setBeanFactory (PersistenceExceptionTranslationPostProcessor.java:97) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1326) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java: 473) ... еще 56 Причин: java.lang.NoClassDefFoundError: javassist / bytecode / ClassFile в org.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching (AbstractJarVisitor.java:236) в org.hiberagingVisitor.java:236) .executeJavaElementFilter (AbstractJarVisitor.java:202) по адресу org.hibernate.ejb.packaging.AbstractJarVisitor.addElement (AbstractJarVisitor.java:163) по адресу org.hibernate.ejb.packaging.FileZippedJarVisitor.Visitor.do или FileZippedJarVisitor. hibernate.ejb.packaging.AbstractJarVisitor.getMatchingEntries (AbstractJarVisitor.java:139 ) в org.hibernate.ejb.Ejb3Configuration.addScannedEntries (Ejb3Configuration.java:287) в org.hibernate.ejb.Ejb3Configuration.scanForClasses (Ejb3Configuration.java:614) в org.hibernate3Configuration.java:614) в org.hibernate3Configuration.Ejbiguration.Ejb. 360) в org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory (HibernatePersistence.java:131) в org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactoryBean.createNativeEntityManagerFactory.jpg orgamenativeEntityManagerFactory. AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean.java:291) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1369) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java: 1335) ... еще 73

person nickrak    schedule 07.09.2013