Исключение при развертывании моего JPA-приложения в Websphere 7

У меня проблемы с развертыванием веб-приложения в самой последней версии IBM Websphere 7. Исключение возникает во время инициализации JPA. Приложение использует servlet 2.5, eclipselink 2.1.3, java 6 update 25. persistence.xml использует версию 1.0

Я не уверен, вызвано ли это исключение ошибкой/ошибкой конфигурации в Websphere или моим приложением. Возможно, это также связано с eclipselink.

ОБНОВЛЕНИЕ

Наше приложение не использует JNDI для предоставления источников данных для EclipseLink. Наше приложение передает источник данных непосредственно в EclipseLink (используя специальные свойства EntityManager EclipseLink).

Используемый мною файл 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="default" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source></non-jta-data-source>
    <class>my.applications.entity.classes.A</class>
    <!-- other class definitions follow -->
    <properties>
      <property name="eclipselink.logging.level" value="FINEST" />

      <!-- some other properties, not related to datasources/connections/JNDI 
        follow -->
    </properties>
  </persistence-unit>
</persistence>

Вот вывод System.err:

com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.metadata.MetaDataException: CWWJP0018E: Incorrect syntax or error detected in /path/to/my/project/my_application_war.ear/my_application.war/WEB-INF/classes/ for application my_application_war module my_application.war. The following associated error occurred:
    at com.ibm.ws.jpa.management.JPAApplInfo.processModulePUs(JPAApplInfo.java:185)
    at com.ibm.ws.jpa.management.JPAComponentImpl.startingDeployedModule(JPAComponentImpl.java:895)
    at com.ibm.ws.jpa.management.JPAComponentImpl.stateChanged(JPAComponentImpl.java:748)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.stateChanged(ApplicationMgrImpl.java:1075)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectEvent(DeployedApplicationImpl.java:1302)
    at com.ibm.ws.runtime.component.DeployedModuleImpl.setState(DeployedModuleImpl.java:221)
    at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:607)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:944)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:726)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl$1.run(ApplicationMgrImpl.java:1268)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:4588)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:4766)
    at com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplicationDynamically(ApplicationMgrImpl.java:1273)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2045)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:441)
    at com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:384)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.startCompositionUnit(CompositionUnitMgrImpl.java:655)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.startCompositionUnit(CompositionUnitMgrImpl.java:617)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:1180)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:37)
    at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:244)
    at javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1074)
    at javax.management.modelmbean.RequiredModelMBean.invoke(RequiredModelMBean.java:955)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
    at com.ibm.ws.management.AdminServiceImpl$1.run(AdminServiceImpl.java:1332)
    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
    at com.ibm.ws.management.AdminServiceImpl.invoke(AdminServiceImpl.java:1225)
    at com.ibm.ws.management.commands.AdminServiceCommands$InvokeCmd.execute(AdminServiceCommands.java:251)
    at com.ibm.ws.console.core.mbean.MBeanHelper.invoke(MBeanHelper.java:239)
    at com.ibm.ws.console.appdeployment.ApplicationDeploymentCollectionAction.execute(ApplicationDeploymentCollectionAction.java:564)
    at org.apache.struts.action.RequestProcessor.processActionPerform(Unknown Source)
    at org.apache.struts.action.RequestProcessor.process(Unknown Source)
    at org.apache.struts.action.ActionServlet.process(Unknown Source)
    at org.apache.struts.action.ActionServlet.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:104)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:934)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:353)
    at org.apache.struts.action.RequestProcessor.doForward(Unknown Source)
    at org.apache.struts.tiles.TilesRequestProcessor.doForward(Unknown Source)
    at org.apache.struts.action.RequestProcessor.processForwardConfig(Unknown Source)
    at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(Unknown Source)
    at com.ibm.isclite.container.controller.InformationController.processForwardConfig(InformationController.java:217)
    at org.apache.struts.action.RequestProcessor.process(Unknown Source)
    at org.apache.struts.action.ActionServlet.process(Unknown Source)
    at org.apache.struts.action.ActionServlet.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)
    at com.ibm.ws.console.core.servlet.WSCUrlFilter.setUpCommandAssistence(WSCUrlFilter.java:933)
    at com.ibm.ws.console.core.servlet.WSCUrlFilter.continueStoringTaskState(WSCUrlFilter.java:500)
    at com.ibm.ws.console.core.servlet.WSCUrlFilter.doFilter(WSCUrlFilter.java:321)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:934)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:864)
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager.requestComplete(WorkQueueManager.java:557)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager.attemptIO(WorkQueueManager.java:607)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager.workerRun(WorkQueueManager.java:984)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager$Worker.run(WorkQueueManager.java:1069)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)
Caused by: com.ibm.ws.metadata.MetaDataException: CWWJP0018E: Incorrect syntax or error detected in path/to/my/project/my_application_war.ear/my_application.war/WEB-INF/classes/ for application my_application_war module my_application.war. The following associated error occurred:
    at com.ibm.ws.jpa.management.JPAPxmlInfo.extractPersistenceUnits(JPAPxmlInfo.java:449)
    at com.ibm.ws.jpa.management.JPAScopeInfo.processPersistenceUnit(JPAScopeInfo.java:140)
    at com.ibm.ws.jpa.management.JPAApplInfo.processModulePUs(JPAApplInfo.java:169)
    ... 90 more
Caused by: java.lang.ClassCastException: com.ibm.ws.naming.jndicos.CNContextImpl cannot be cast to javax.sql.DataSource
    at com.ibm.ws.jpa.management.JPAPUnitInfo.getJPADataSource(JPAPUnitInfo.java:493)
    at com.ibm.ws.jpa.management.JPAPUnitInfo.getNonJtaDataSource(JPAPUnitInfo.java:577)
    at com.ibm.ws.jpa.management.JPAPUnitInfo.createEntityManagerFactory(JPAPUnitInfo.java:1314)
    at com.ibm.ws.jpa.management.JPAPxmlInfo.extractPersistenceUnits(JPAPxmlInfo.java:393)
    ... 92 more

person MRalwasser    schedule 09.06.2011    source источник


Ответы (3)


Пустой не-jta-источник данных заставляет WebSphere Application Server выполнять поиск (""), который возвращает корневой контекст, который затем пытается преобразовать в DataSource.

JPA, управляемый контейнером, предназначен для того, чтобы контейнер мог получить источник данных и передать его самому EM. Я бы порекомендовал вам либо указать источник данных в файле persistence.xml, либо вообще отключить JPA, управляемый контейнером, чтобы избежать ошибки при запуске приложения:

http://www-01.ibm.com/support/docview.wss?uid=swg1PM26361

person Brett Kail    schedule 09.06.2011
comment
Я не хочу использовать JPA, управляемый контейнером. Я использую RESOURCE_LOCAL. - person MRalwasser; 09.06.2011
comment
Этот параметр предназначен для JTA, управляемого контейнером (т. е. для взаимодействия поставщика JPA со службой транзакций), а не для взаимодействия контейнера с поставщиком JPA. Если документ PM26361 помог избежать необходимости в JPA, управляемом контейнером, есть ли что-то еще, что вам нужно, прежде чем принять ответ? - person Brett Kail; 10.06.2011
comment
Источник данных, отличный от jta, предназначен не только для настроек JTA, управляемых контейнером. Он предлагает установить DataSource с помощью JNDI, что также может быть выполнено приложением. В качестве обходного пути мне пришлось включить тег, чтобы заставить EL использовать JNDIConnector, чтобы переопределить получение внутреннего соединения и разрешить мне использовать мой пул соединений. Однако этот тег вызывает проблемы на последних серверах приложений (я не вижу проблемы в Websphere 6.1). Теперь я установил JNDIConnector в своем коде, чтобы я мог удалить тег. Я приму ваш ответ, потому что ваши подсказки были очень полезными, хотя не все было правильно. Спасибо. - person MRalwasser; 10.06.2011
comment
В соответствии с 8.2.1.5 спецификации JPA 2.0 источник данных должен быть предоставлен в среде EE, которая поддерживает JPA, управляемую контейнером. WebSphere Application Server 6.1 (без пакета функций EJB3) не поддерживал JPA, управляемый контейнером, поэтому ваш файл persistence.xml был проигнорирован. - person Brett Kail; 10.06.2011
comment
Это правильно. Я думаю, проблема здесь в том, что я определил Java SE Environment как среду, в которой я сам создаю свой EntityManager (что я и делаю) независимо от того, развернуто ли мое приложение в контейнере JEE или нет. что это определение неверно или, по крайней мере, не полностью определено в спецификации JPA. Поэтому до сих пор я думал, что третий абзац упомянутого вами раздела вступил в силу: в средах Java SE эти элементы могут использоваться или информация об источнике данных может указываться другими способами — в зависимости от требований провайдера. - person MRalwasser; 10.06.2011
comment
Верно, в среде JEE контейнер должен вызывать createContainerEntityManagerFactory очень рано во время запуска приложения, чтобы поставщик мог добавить ClassTransformers. В рамках этого WebSphere Application Server получает источник данных для передачи в составе PersistenceUnitInfo. Итак, в вашем случае контейнер выходит из строя еще до того, как он попадет в ваш код, подобный Java SE. - person Brett Kail; 10.06.2011

Websphere, похоже, проверяет значение вашего источника данных в файле persistence.xml, и оно кажется недействительным. Вам нужно указать действительное значение, даже если вы переопределите его позже.

Пожалуйста, включите ваш файл persistence.xml. Вы также можете попробовать не устанавливать источник данных или использовать resource_local, если он не позволяет использовать источник данных.

person James    schedule 09.06.2011
comment
Я обновил вопросы, которые включают в себя файл persistence.xml. Я не устанавливаю источник данных и использую resource_local. Но, может быть, проблема в пустом <non-jta-data-source></non-jta-data-source>? (но, кстати: у других серверов приложений нет проблем с этим веб-приложением) - person MRalwasser; 09.06.2011

Caused by: java.lang.ClassCastException: com.ibm.ws.naming.jndicos.CNContextImpl cannot be cast to javax.sql.DataSource
    at com.ibm.ws.jpa.management.JPAPUnitInfo.getJPADataSource(JPAPUnitInfo.java:493)
    at com.ibm.ws.jpa.management.JPAPUnitInfo.getNonJtaDataSource(JPAPUnitInfo.java:577)
    at com.ibm.ws.jpa.management.JPAPUnitInfo.createEntityManagerFactory(JPAPUnitInfo.java:1314)
    at com.ibm.ws.jpa.management.JPAPxmlInfo.extractPersistenceUnits(JPAPxmlInfo.java:393)
    ... 92 more

В вашей конфигурации EAR вы установили контекст JNDI, где должен быть источник данных JNDI.

person Karl-Bjørnar Øie    schedule 09.06.2011
comment
Наше приложение не использует JNDI для предоставления источников данных для EclipseLink. Наше приложение передает источник данных непосредственно в EclipseLink (используя специальные свойства EntityManager EclipseLink). Я обновил вопрос. - person MRalwasser; 09.06.2011