1

我是 WAS Liberty 的新手,正在尝试部署 Spring Boot 应用程序。服务器在启动时抛出异常。

[AVERTISSEMENT] 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“entityManagerFactory”的bean时出错[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration .class]: init 方法调用失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; 嵌套异常是 java.lang.UnsupportedOperationException

问题是 Hibernate 试图用错误的事务管理器类调用挂起: 原因:org.hibernate.engine.transaction.jta.platform.internal 的 java.lang.UnsupportedOperationException。WebSphereExtendedJtaPlatform $TransactionManagerAdapter.suspend(WebSphereExtendedJtaPlatform.java:131)

这个类是由 Spring Boot 在 HibernateJpaConfiguration 类中配置的,它不包括正确的事务管理器:

私有静态最终字符串 [] WEBSPHERE_JTA_PLATFORM_CLASSES = { "org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform", "org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" };

当我将类更改为 org.hibernate.engine.transaction.jta.platform.internal.WebSphereLibertyJtaPlatform 时,应用程序启动。这是配置问题还是 Spring Boot 不支持 WAS Liberty。

谢谢你的帮助。

4

2 回答 2

1

根据此问题,从 5.2.13 和 5.3.Beta2 版本开始将其WebSphereLibertyJtaPlatform引入 Hibernate:https ://hibernate.atlassian.net/browse/HHH-11571

如果您使用的 Hibernate 版本包含WebSphereLibertyJtaPlatform并且未显式设置 JTA 平台类属性,则将自动检测和使用 Liberty 平台。

于 2018-08-23T13:47:02.320 回答
0

据我了解,Spring Boot 2.0.4 及其默认的 Hibernate 版本(5.2.17)支持 Liberty。然而,问题是,如Spring Boot 问题 #8926中所述,Spring Boot 2.0.4 覆盖了 Websphere Liberty JTA 实现,否则 Hibernate 将正确设置该实现。

由于各种原因,我坚持使用 Liberty 16.0.0.4 和 Spring Boot 2.0.4,需要找到一种方法来设置正确的 Websphere Liberty JTA 实现。我最终使用像这样的bean覆盖了该hibernate.transaction.jta.platform属性HibernatePropertiesCustomizer

@Bean
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer() {
    return hibernateProperties ->
            hibernateProperties.put("hibernate.transaction.jta.platform",
                    "org.hibernate.engine.transaction.jta.platform.internal.WebSphereLibertyJtaPlatform");
}
于 2019-02-18T19:01:40.977 回答