Невозможно перенести WAR-файл с Tomcat на Glassfish.Ошибка с RESOURCE_LOCAL против JTA - PullRequest
4 голосов
/ 22 марта 2011

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

com.sun.enterprise.deployment.backend.IASDeploymentException: Ошибка развертывания - настойчивость, контекстно-реф-имя [Org.nhindirect.config.store.dao.impl.AnchorDaoImpl / EntityManager] в модуле [C: \ Sun \ AppServer \ домены \ domain1 \ приложения \ j2ee-модули \ конфиг-служба] разрешается в единицу постоянства называется [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. Изменено version="2.5" на version="2.4"
  2. Изменено xmlns="http://java.sun.com/xml/ns/javaee"
    до
    xmlns="http://java.sun.com/xml/ns/j2ee"
  3. Изменено 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"

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

Инициализирован контекст отправки исключения событие для слушателя экземпляра класса org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'Org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor # 0' определено в ресурсе ServletContext [/WEB-INF/beans.xml]: инициализация бобов не удалось; вложенное исключение org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'entityManagerFactory', определенный в ServletContext ресурс [/WEB-INF/beans.xml]: вызов сбой метода init; вложенное исключение является java.lang.NoClassDefFoundError: javassist / bytecode / ClassFile at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:480) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory $ 1.run (AbstractAutowireCapableBeanFactory.java:409) в java.security.AccessController.doPrivileged (Native Метод) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:380) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:264) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.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.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:164) в org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:880) в org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors (AbstractApplicationContext.java:596) в org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:365) в org.springframework.web.context.ContextLoader.createWebApplicationContext (ContextLoader.java:255) в org.springframework.web.context.ContextLoader.initWebApplicationContext (ContextLoader.java:199) вorg.springframework.web.context.ContextLoaderListener.contextInitialized (ContextLoaderListener.java:45) в org.apache.catalina.core.StandardContext.listenerStart (StandardContext.java:4655) в org.apache.teartinaStandardContext.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.java:704) по адресу com.sun.enterprise.web.WebContainer.loadWebModule (WebContainer.java).) на com.sun.enterprise.web.WebContainer.loadWebModule (WebContainer.java:1254) на com.sun.enterprise.server.WebModuleDeployEventListener.moduleDeployed (WebModuleDeployEventListener.java:182) на com.sun.er.vent.ventEvent.Wevent.moduleDeployed (WebModuleDeployEventListener.java:278) в com.sun.enterprise.admin.event.AdminEventMulticaster.invokeModuleDeployEventListener (AdminEventMulticaster.java:1005) по адресу com.sun.enterprise.admin.event.AdminEventMulticaster.handleModuleDeployEvent (AdminEventMulticaster.java:992) по адресу com.sun.enterprise.admin.event.AdminEventMasteric ()на com.sun.enterprise.admin.event.AdminEventMulticaster.multicastEvent (AdminEventMulticaster.java:182) на com.sun.enterprise.admin.server.core.DeploymentNotificationHelper.multicastEvent (DeploymentNotificationHelper.java:308pr) на com.sun.enter..deployment.(ApplicationStartPhase.java:132) в com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase (DeploymentPhase.java:108) в com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases (PEDeploymentService.java:966) на com.sun.enterprise.deployment.phasing.PEDeploymentService.start (PEDeploymentService.java:609) на com.sun.enterprise.deployment.phasing.PEDeploymentService.start (PEDeploymentService.java:653) в com.sun.enterprise.admin..DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.Method.invoke (Method.java:597) в com.sun.enterprise.admin.MBeanHelper.invokeOperationIneeBean (Bean)sun.DefaultMBeanServerInterceptor.java:836) на com.sun.jmx.mbeanserver.JmxMBeanServer.invoke (JmxMBeanServer.java:761) в sun.reflect.GeneratedMethodAccessor13.invoke (Неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:lan.hore.j.ref.Java: 597) на 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.java:170) в com.sun.enterprise.deployment.client.DeploymentClientUtils.startApplication:9) на com.sun.enterprise.deployment.client.DeployAction.run (DeployAction.java:538) на java.lang.Thread.run (Thread.java:619). Причина:org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'entityManagerFactory', определенный в ServletContext ресурс [/WEB-INF/beans.xml]: вызов сбой метода init; вложенное исключение является java.lang.NoClassDefFoundError: javassist / bytecode / ClassFile at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1338) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:473) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory $ 1.run (AbstractAutowireCapableBeanFactory.java:409) в java.security.AccessController.doPrivileged (Native Метод) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:380) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:264) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.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.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:164) в org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType (DefaultListableBeanFactory.java:308) в org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors (BeanFactoryUtils.java:270) в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators (PersistenceExceptionTranslationInterceptor.java:122) в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor. (PersistenceExceptionTranslationInterceptor.java:78) в org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor. (PersistenceExceptionTranslationAdvisor.java:70) в org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.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 at org.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching (AbstractJarVisitor.java:236) в org.hibernate.ejb.packaging.AbstractJarVisitor.executeJavaElementFilter (AbstractJarVisitor.java:202) в org.hibernate.ejb.packaging.AbstractJarVisitor.addElement (AbstractJarVisitor.java:163) в org.hibernate.ejb.packaging.FileZippedJarVisitor.doProcessElements (FileZippedJarVisitor.java:100) в org.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.hibernate.ejb.Ejb3Configuration.configure (Ejb3Configuration.java:360) в org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory (HibernatePersistence.java:131) в org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean.java:224) в org.springframework.orm.jpa.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 * более 1055

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

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

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

<?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>

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

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

1 Ответ

2 голосов
/ 07 сентября 2013

Где-то в вашем коде вы, вероятно, вводите EntityManager, используя код, который выглядит примерно так:

@PersistanceContext    // Requires JTA
EntityManager em;

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

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

@PersistanceUnit    // Does NOT require JTA
EntityManagerFactory factory;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...