2014-09-10 1 views
0

Так что я использую JPA (реализация OpenJPA 2.3.0), пожалуй, довольно нетрадиционным способом. Я пишу часть программного обеспечения, которое будет содержать некоторые данные о персонале и назначать работу указанному персоналу. Какой тип работы, который он назначает, не определен - пользователь должен расширить сопоставленный суперкласс, добавить любые дополнительные сопоставления для этого класса, и мое программное обеспечение в основном возьмет его оттуда. У нас есть несколько систем, которые следуют этой схеме, и мы только хотели написать код назначения один раз. Тем не менее, есть небольшие различия в том, что назначается - какая-то система назначает случай, другая назначает меньшую часть корпуса, другие назначают на основе клиента и т. Д.Упаковка persistence.xml за пределами банки с OpenJPA

Чтобы получить максимальную конфигурацию, я поместил все метаданные для мои постоянные объекты в файл сопоставления вместо использования аннотаций. Поскольку программист, использующий мое программное обеспечение, должен будет расширить этот сопоставленный суперкласс и добавить собственное сопоставление в блок персистентности, я не хотел бы упаковывать persistence.xml или мое сопоставление XML в создаваемую банку. Я подумал, что программист может включать эти файлы где-то в ухо. Я написал всю вещь, используя Java SE, а не EE, поэтому я сам создаю EntityManagerFactory вместо того, чтобы вводить его.

Моя организация использует WebSphere Application Server 7.0, которая реализует Java EE 5. Рассматривая документацию для JPA в Java EE 5, казалось, что моему пользователю придется упаковать файл persistence.xml и отобразить XML-файлы в отдельную банку, которая могут быть помещены в папку библиотеки ушей. Затем они могут ссылаться на мой файл jar в файле persistence.xml. Что-то вроде следующего (имя моего программного обеспечения WAM):

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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_2_0.xsd"> 
<persistence-unit name="WAM" transaction-type="RESOURCE_LOCAL"> 
    <mapping-file>wamMapping.xml</mapping-file> 
    <jar-file>wam-1.0.0.jar</jar-file> 
</persistence-unit> 

Я попытался написать быстрый и грязный веб-службы таким образом. Я добавил файл persistence.xml и сопоставил XML в jar wam-config.jar и засунул его в папку библиотеки ушей. Когда я делаю запрос на веб-службы, я получаю следующее сообщение об ошибке обратно:

javax.persistence.PersistenceException: Explicit persistence provider error(s) occurred for &quot;WAM&quot; after trying the following discovered implementations: com.ibm.websphere.persistence.PersistenceProviderImpl, org.apache.openjpa.persistence.PersistenceProviderImpl, org.apache.openjpa.persistence.PersistenceProviderImpl, org.apache.openjpa.persistence.PersistenceProviderImpl with the following failures: 
com.ibm.websphere.persistence.PersistenceProviderImpl returned: java.lang.IllegalArgumentException: The jar resource &quot;wam-1.0.0.jar&quot; cannot be loaded. 
at org.apache.openjpa.persistence.PersistenceUnitInfoImpl.validateJarFileName(PersistenceUnitInfoImpl.java:277) 
at org.apache.openjpa.persistence.PersistenceUnitInfoImpl.processJarFileNames(PersistenceUnitInfoImpl.java:239) 
at org.apache.openjpa.persistence.PersistenceProductDerivation.load(PersistenceProductDerivation.java:538) 
at org.apache.openjpa.persistence.PersistenceProductDerivation.load(PersistenceProductDerivation.java:335) 
at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:89) 
at com.ibm.websphere.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:73) 
at com.ibm.websphere.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:43) 
at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:154) 
at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:65) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:150) 
at gov.ssa.wam.service.BaseWAMService.initializeEntityManagerFactory(BaseWAMService.java:73) 
at gov.ssa.wam.service.BaseWAMService.&lt;init&gt;(BaseWAMService.java:34) 
at gov.ssa.wam.service.WAMServiceDelegate.getInstance(WAMServiceDelegate.java:31) 
at gov.ssa.earnings.webservice.WAMServiceBean.&lt;init&gt;(WAMServiceBean.java:22) 
at java.lang.J9VMInternals.newInstanceImpl(Native Method) 
at java.lang.Class.newInstance(Class.java:1474) 
at com.ibm.wsspi.injectionengine.InjectionUtil.createInjectedInstance(InjectionUtil.java:79) 
at com.ibm.ws.websvcs.server.WSServiceInstanceFactory.createServiceInstance(WSServiceInstanceFactory.java:110) 
at org.apache.axis2.jaxws.server.EndpointController.handleRequest(EndpointController.java:247) 
at org.apache.axis2.jaxws.server.EndpointController.invoke(EndpointController.java:103) 
at org.apache.axis2.jaxws.server.JAXWSMessageReceiver.receive(JAXWSMessageReceiver.java:161) 
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:189) 
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275) 
at com.ibm.ws.websvcs.transport.http.WASAxis2Servlet.doPost(WASAxis2Servlet.java:1431) 
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:1663) 
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939) 
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502) 
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181) 
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:1592) 
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.HttpInboundLink.ready(HttpInboundLink.java:276) 
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) 
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) 
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) 
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) 
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1646) 
org.apache.openjpa.persistence.PersistenceProviderImpl returned: java.lang.IllegalArgumentException: The jar resource &quot;wam-1.0.0.jar&quot; cannot be loaded. 
at org.apache.openjpa.persistence.PersistenceUnitInfoImpl.validateJarFileName(PersistenceUnitInfoImpl.java:277) 
at org.apache.openjpa.persistence.PersistenceUnitInfoImpl.processJarFileNames(PersistenceUnitInfoImpl.java:239) 
at org.apache.openjpa.persistence.PersistenceProductDerivation.load(PersistenceProductDerivation.java:538) 
at org.apache.openjpa.persistence.PersistenceProductDerivation.load(PersistenceProductDerivation.java:335) 
at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:89) 
at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:154) 
at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:65) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:150) 
at gov.ssa.wam.service.BaseWAMService.initializeEntityManagerFactory(BaseWAMService.java:73) 
at gov.ssa.wam.service.BaseWAMService.&lt;init&gt;(BaseWAMService.java:34) 
at gov.ssa.wam.service.WAMServiceDelegate.getInstance(WAMServiceDelegate.java:31) 
at gov.ssa.earnings.webservice.WAMServiceBean.&lt;init&gt;(WAMServiceBean.java:22) 
at java.lang.J9VMInternals.newInstanceImpl(Native Method) 
at java.lang.Class.newInstance(Class.java:1474) 
at com.ibm.wsspi.injectionengine.InjectionUtil.createInjectedInstance(InjectionUtil.java:79) 
at com.ibm.ws.websvcs.server.WSServiceInstanceFactory.createServiceInstance(WSServiceInstanceFactory.java:110) 
at org.apache.axis2.jaxws.server.EndpointController.handleRequest(EndpointController.java:247) 
at org.apache.axis2.jaxws.server.EndpointController.invoke(EndpointController.java:103) 
at org.apache.axis2.jaxws.server.JAXWSMessageReceiver.receive(JAXWSMessageReceiver.java:161) 
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:189) 
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275) 
at com.ibm.ws.websvcs.transport.http.WASAxis2Servlet.doPost(WASAxis2Servlet.java:1431) 
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:1663) 
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939) 
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502) 
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181) 
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:1592) 
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.HttpInboundLink.ready(HttpInboundLink.java:276) 
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) 
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) 
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) 
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) 
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1646) 

WAM-1.0.0.jar файл находится в папке библиотеки ухо. Кажется, что найти persistence.xml в wam-config.jar, но он не может найти (или не использовать) wam-1.0.0.jar. Кто-нибудь знает, где я ошибаюсь?

Редактировать: добавлена ​​полная трассировка стека за запрос. Извини за это!

+0

Это трассировка стека _COMPLETE_? Если нет, опубликуйте его. –

ответ

0

Я понял. Кажется, что он не смог найти мой файл XML-отображения.

Я начал экспериментировать, делая вещи «классическим» способом - включая файл persistence.xml и мой XML-файл отображения в банке с моими сохраняемыми объектами. Это тоже не работало. Затем я изменил путь к моему файлу сопоставления в файле persistence.xml на «META-INF/wamMapping.xml», и все началось! После этого я удалил persistence.xml и мое сопоставление XML из моего jar-файла и поместил их в отдельный файл jar внутри каталога META-INF. Затем я поместил это в свою библиотеку уха. Еще работает!

У меня теперь возникают проблемы с тем, чтобы дополнительные постоянные классы в моей войне работали правильно, но это другая проблема.