使用 Hibernate JPA 2.1 将应用程序部署到 IBM WebSphere 会出现 NullPointerException

Deploying application using Hibernate JPA 2.1 to IBM WebSphere gives NullPointerException

我们正在尝试将使用 Hibernate 的 Java 7 Spring MVC 应用程序部署到 IBM WebSphere 8.5.5.2 服务器中。该应用程序在 Tomcat 服务器上运行良好,但我们无法在 WebSphere 运行 中获取它。

堆栈跟踪输出如下:

[3/26/15 13:49:53:552 MDT] 00000066 AutowiredAnno I org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init> JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
[3/26/15 13:49:54:299 MDT] 00000066 LocalContaine I org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean createNativeEntityManagerFactory Building JPA container EntityManagerFactory for persistence unit 'default'
[3/26/15 13:49:54:339 MDT] 00000066 LogHelper     Z org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
[3/26/15 13:49:54:536 MDT] 00000066 Version       Z org.hibernate.Version logVersion HHH000412: Hibernate Core {4.3.7.Final}
[3/26/15 13:49:54:543 MDT] 00000066 Environment   Z org.hibernate.cfg.Environment <clinit> HHH000206: hibernate.properties not found
[3/26/15 13:49:54:546 MDT] 00000066 Environment   Z org.hibernate.cfg.Environment buildBytecodeProvider HHH000021: Bytecode provider name : javassist
[3/26/15 13:49:54:580 MDT] 00000066 JarInputStrea Z org.hibernate.jpa.boot.archive.internal.JarInputStreamBasedArchiveDescriptor visitArchive HHH015010: Unable to find file (ignored): bundleresource://130.fwk-1163147521/
                                 java.lang.NullPointerException: in is null
    at java.util.zip.ZipInputStream.<init>(ZipInputStream.java:111)
    at java.util.zip.ZipInputStream.<init>(ZipInputStream.java:90)
    at java.util.jar.JarInputStream.<init>(JarInputStream.java:87)
    at java.util.jar.JarInputStream.<init>(JarInputStream.java:73)
    at org.hibernate.jpa.boot.archive.internal.JarInputStreamBasedArchiveDescriptor.visitArchive(JarInputStreamBasedArchiveDescriptor.java:73)
    at org.hibernate.jpa.boot.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:72)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.scan(EntityManagerFactoryBuilderImpl.java:725)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:221)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:188)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.<init>(SpringHibernateJpaPersistenceProvider.java:49)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:49)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1686)
    at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:414)
    at com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:88)
    at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:169)
    at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:749)
    at com.ibm.ws.webcontainer.WSWebContainer.addWebApplication(WSWebContainer.java:634)
    at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:426)
    at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:718)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1177)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1370)
    at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:639)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:968)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:776)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.run(ApplicationMgrImpl.java:2195)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:5474)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:5600)
    at com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2200)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:446)
    at com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:389)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access0(CompositionUnitMgrImpl.java:117)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:995)
    at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:502)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1864)

[3/26/15 13:49:54:899 MDT] 00000066 Version       Z org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
[3/26/15 13:49:55:511 MDT] 00000066 Enhance       E   CWWJP9992E: openjpa.Enhance: Error: The identity field defined in the com.company.model.KeyValueMapping Embeddable is not supported. 
[3/26/15 13:49:55:837 MDT] 00000066 Dialect       Z org.hibernate.dialect.Dialect <init> HHH000400: Using dialect: org.hibernate.dialect.SQLServer2008Dialect
[3/26/15 13:49:55:864 MDT] 00000066 LobCreatorBui Z org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
[3/26/15 13:49:56:071 MDT] 00000066 AnnotationCon W org.springframework.context.support.AbstractApplicationContext refresh Exception encountered during context initialization - cancelling refresh attempt
                                 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in com.company.WebConfig: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()[Ljavax/persistence/Index;
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1686)
    at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:414)
    at com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:88)
    at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:169)
    at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:749)
    at com.ibm.ws.webcontainer.WSWebContainer.addWebApplication(WSWebContainer.java:634)
    at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:426)
    at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:718)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1177)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1370)
    at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:639)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:968)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:776)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.run(ApplicationMgrImpl.java:2195)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:5474)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:5600)
    at com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2200)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:446)
    at com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:389)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access0(CompositionUnitMgrImpl.java:117)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:995)
    at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:502)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1864)
Caused by: java.lang.NoSuchMethodError: javax/persistence/Table.indexes()[Ljavax/persistence/Index;
    at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:973)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:824)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:852)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:845)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564)
    ... 37 more

谢谢!

javax/persistence/Table.indexes() 来自 JPA 2.1,WebSphere Application Server traditional 8.5.5.2 默认使用 JPA 2.0 (OpenJPA)。如果您想使用 Hibernate,您必须覆盖默认提供程序 - 查看 this post 了解更多详细信息。

更新

是的,你是对的。您不能使用 JPA 2.1 覆盖 WebSphere 传统 8.5.5.x 中的默认提供程序,因为容器依赖于 2.0 api 进行初始化。

如果您必须使用 2.1,您可以将其用作应用程序管理的提供程序而不是容器管理的。因此,您需要为您的应用程序禁用 JPA,check this 而不是依赖容器注入 EntityManager,使用 API.

自行初始化它

另一种选择是考虑 WebSphere Liberty,它从 8.5.5.6 版开始支持 JPA 2.1(使用 EclipseLink)。应该可以在那里更改提供程序,因为容器支持 2.1,但是我没有时间测试它。

您还可以升级到最近发布的支持 JPA 2.1 的 WebSphere Application Server v9。

我想我会分享对我有用的东西。我能够通过使用自定义 PersistenceProviderResolver 在 Websphere 8.5.5.5 上使用 JPA 2.1 和 Hibernate 4.3.11,这样 Websphere 类 就不会干扰 Hibernate https://gist.github.com/jeffsheets/aec3e94870ef903ce7efe33e00563d3c

我根据这里 https://hibernate.atlassian.net/browse/JPA-4

找到的 post

我分享对我有用的东西。我和我的团队能够在 Websphere 8.5.5 和 Websphere 7 中使用 Spring 4.2.4、Hibernate 5.1 和 Hibernate JPA 2.1 部署我们的应用程序。

这样做的关键是提取所有休眠库并将它们放在服务器的共享库文件夹中,在服务器配置中创建一个新的 class 加载器,父级上次订购并分配给它class 加载包含休眠库的共享库。然后您必须更改 默认 Java 持久性 API 设置 以使用休眠持久性提供程序而不是默认的 WebSphere 持久性提供程序。所以步骤如下:

  1. 在您的服务器中创建一个文件夹并将所有休眠库放入其中

  2. 在Websphere中创建共享库(Environment / Shared libraries)并设置为刚才在服务器上创建的文件夹路径

  3. 在 WebSphere 上单击您的服务器,然后在 Server Infrastructure 下单击 Java 和 Process Management / Class 装载机。单击 New 和 select Parent Last 选项。保存

  4. 单击您刚刚创建的新 class 加载器,然后单击右侧的 Shared library references。这里添加包含 Hibernate Libraries

  5. 的共享库
  6. 现在在服务器的容器设置部分下单击 容器服务/默认 Java 持久性 API 设置。在这里您必须指定一个备用的默认持久性提供程序。见下图。

  7. 现在编译您的应用程序并从生成的 war Hibernate 库中删除(见图 1)。然后安装到服务器中。

在我的案例中,应用程序在 WebSphere 7 中也非常出色。 此过程解决了 javax/persistence/Table.indexes() 错误以及由 WebSphere 和 Hibernate 之间的库冲突引起的所有其他编译错误。

参考:

https://www.ibm.com/developerworks/community/wikis/form/anonymous/api/wiki/53181ccd-bcd4-431f-b968-0b5f6d46d652/page/192a432b-28bb-4080-b037-345e5d83da76/attachment/61e74f67-1d60-4120-ba25-ad7264c9f4f6/media/AlternateJPAProviders_TestReport.pdf

我让它与 Spring Boot 2.1.4、Hibernate 5.3.9.Final 和 WAS 8.5.5 一起工作,没有任何服务器级别的更改: ).这些步骤在我下面的文章中进行了概述。仍在使用 JPA 2.1,根本不需要降级到 JPA 2.0。

[How-to] Deploy Spring Boot 2.x apps on WebSphere 8.5.5

对我有用的是:

在日志中(从 OP 的日志中复制),有这样的:

[3/26/15 13:49:54:339 MDT] 00000066 LogHelper     Z org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]

如果您注意到,它正在尝试使用 默认 持久性提供程序。

因此,如果我们没有明确指定要使用的持久性提供程序,Hibernate 将使用 WAS 持久性提供程序(即本例中的 OpenJPA)——对于 WebLogic,EclipseLink。

由于 WAS 8.5。5.x 仅支持 JPA 2.0(和 JPA 1.0),这将不起作用并且日志中会出现一堆错误(...),例如由OP.

为了解决这个问题,我根据this post

明确指定了Hibernate的第三方持久化

我希望这会对某人有所帮助。

我遵循了 amicoderozer 在 Websphere 8.5.5 上的回答。但是,我不得不再做一些修改。

  1. 将 JPA 库提取到新的共享库中

如 amicoderozer 所写,您必须将 JPA 库提取到一个新的共享库中,并且 select 标志 为此共享库使用隔离的 class 加载器.

{JPA_LIBS}/antlr-2.7.7.jar
{JPA_LIBS}/byte-buddy-1.10.10.jar
{JPA_LIBS}/classmate-1.3.4.jar
{JPA_LIBS}/dom4j-2.1.3.jar
{JPA_LIBS}/FastInfoset-1.2.15.jar
{JPA_LIBS}/hibernate-commons-annotations-5.1.0.Final.jar
{JPA_LIBS}/hibernate-core-5.4.16.Final.jar
{JPA_LIBS}/hibernate-entitymanager-5.4.16.Final.jar
{JPA_LIBS}/hibernate-jpa-2.1-api-1.0.0.Final.jar
{JPA_LIBS}/hibernate-validator-5.4.3.Final.jar
{JPA_LIBS}/istack-commons-runtime-3.0.7.jar
{JPA_LIBS}/jandex-2.0.5.Final.jar
{JPA_LIBS}/javax.activation-api-1.2.0.jar
{JPA_LIBS}/javax.persistence-api-2.2.jar
{JPA_LIBS}/jaxb-api-2.3.1.jar
{JPA_LIBS}/jaxb-runtime-2.3.1.jar
{JPA_LIBS}/jboss-logging-3.3.2.Final.jar
{JPA_LIBS}/jboss-transaction-api_1.2_spec-1.1.1.Final.jar
{JPA_LIBS}/jpa.txt
{JPA_LIBS}/stax-ex-1.8.jar
{JPA_LIBS}/txw2-2.3.1.jar
{JPA_LIBS}/validation-api-2.0.1.Final.jar
  1. 导航到“应用程序服务器 > your_server > 默认 Java 持久性 API 设置”部分并访问“默认 Java 持久性 API”。 在那里,单击单选按钮 “指定备用默认持久性提供程序” 并输入:

org.hibernate.jpa.HibernatePersistenceProvider

  1. 在创建 JVM 变量的服务器级别禁用 JPA 处理(Your_Server > 进程定义 > Java 虚拟机 > 自定义属性)

com.ibm.websphere.persistence.ApplicationsExcludedFromJpaProcessing => *

  1. 在您的应用程序安装期间,select您在第一步中创建的 JPA 共享库

  2. 安装应用程序后,导航至“企业应用程序 > Your_APP_name > 管理模块 > YourModule”。 最后,select PARENT_LAST 上 属性 “Class 加载器顺序”