Spring java.lang.ClassCastException:com.ibm.ws.tx.jta.TranManagerSet与javax.transaction.TransactionManager不兼容
我在尝试通过WebSphere8.5.5.10上的Hibernate5搜索API索引实体时遇到类强制转换异常。事务由Spring事务管理。文档实体在本地tomcat上得到了正确的索引,但在WebSphere上没有 我创建了一个RESTfulWeb服务调用来索引实体 春季4.2 Hibernate Core 5.0.11.Final Hibernate搜索5.5.5.Final 这是我的配置文件Spring java.lang.ClassCastException:com.ibm.ws.tx.jta.TranManagerSet与javax.transaction.TransactionManager不兼容,spring,hibernate,spring-transactions,websphere-8,hibernate-search,Spring,Hibernate,Spring Transactions,Websphere 8,Hibernate Search,我在尝试通过WebSphere8.5.5.10上的Hibernate5搜索API索引实体时遇到类强制转换异常。事务由Spring事务管理。文档实体在本地tomcat上得到了正确的索引,但在WebSphere上没有 我创建了一个RESTfulWeb服务调用来索引实体 春季4.2 Hibernate Core 5.0.11.Final Hibernate搜索5.5.5.Final 这是我的配置文件 <bean id="sessionFactory" class="org.springf
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="packagesToScan">
<list>
<value>model</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.default_schema">dev</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.search.default.directory_provider">filesystem</prop>
<prop key="hibernate.search.default.indexBase">/var/lucene/indexes</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
模型
org.hibernate.dialen.oracle10galent
真的
假的
发展
真的
文件系统
/var/lucene/指数
以及websphere应用程序日志中的堆栈跟踪:-
HSEARCH000058:HSEARCH000116:MassIndexer操作期间出现意外错误
org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformException:无法获取WebSphere TransactionManager
在org.hibernate.engine.transaction.jta.platform.internal.webspherejstatplatform.locateTransactionManager(webspherejstatplatform.java:66)
位于org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform.retrieveTransactionManager(AbstractJtaPlatform.java:87)
位于org.hibernate.search.batchindexing.impl.BatchTransactionalContext.lookupTransactionManager(BatchTransactionalContext.java:53)
位于org.hibernate.search.batchindexing.impl.BatchTransactionalContext。(BatchTransactionalContext.java:42)
位于org.hibernate.search.batchindexing.impl.BatchIndexingWorkspace.runWithErrorHandler(BatchIndexingWorkspace.java:118)
位于org.hibernate.search.batchindexing.impl.ErrorHandleRunnable.run(ErrorHandleRunnable.java:32)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:483)
位于java.util.concurrent.FutureTask.run(FutureTask.java:274)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:627)
运行(Thread.java:798)
原因:java.lang.ClassCastException:com.ibm.ws.tx.jta.TranManagerSet与javax.transaction.TransactionManager不兼容
在org.hibernate.engine.transaction.jta.platform.internal.webspherejstaplatform.locateTransactionManager(webspherejstaplatform.java:63)
我不确定我在这里做错了什么。除了索引Web服务调用外,其他REST Web服务运行良好,我的UI按预期填充
任何帮助都将不胜感激。根据,这是两个不同版本的java.transaction
包之间的冲突(一个在websphere中,一个在GemFire.jar中,一个在websphere中部署的库)
它还提出了一个解决方案:
从GemFire.jar中删除包javax.transaction
:zip-d GemFire.jar javax/transaction/*
希望这有帮助。我们遇到了这个问题 问题: 如果我们使用的hibernate版本使用JPA 2.1(>hibernate版本4.3),它将与websphere的旧版本(没有JPA 2.1补丁包的版本7、8.5)冲突。具体来说,您会看到以下例外情况:
nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()[Ljavax/persistence/Index;
解决方案1:
解决此问题的一种方法是将classloader设置为parent\u last
,以便使用hibernate附带的JPA2.1。但是,您将遇到与上述问题类似的其他问题
java.lang.ClassCastException:com.ibm.ws.tx.jta.TranManagerSet不兼容
使用javax.transaction.TransactionManager
这可以通过排除以下jar(示例maven)来解决
导致
冲突:
<exclusion>
<artifactId>jboss-transaction-api_1.2_spec</artifactId>
<groupId>org.jboss.spec.javax.transaction</groupId>
</exclusion>
使用自定义PersistenceProviderResolver,以便Websphere类不会干扰Hibernate:
在SpringBoot 2.2.0.RELEASE版本中,使用了来自雅加达的事务管理器api。如果你想让它工作,就排除它
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
</dependency>
雅加达交易中心
jakarta.transaction-api
从
org.springframework.boot
spring引导启动器数据jpa
基本思想是只有一个事务管理器。这里我们将删除sprintboot jpa中提供的一个感谢您的帮助,但是我的WebSphere设置已经设置为:class Loader-parent_last,War class-“应用程序中每个War文件的class Loader”javax.transaction.TransactionManager是一个平台接口:更改class Loader选项没有帮助。您必须确保您的应用程序不包含任何可能冲突的可传递依赖项。然后您应该尝试第一种解决方案,破解
GemFire.jar
@谢谢你的评论。我将相应地更新我的解决方案。@Sanne我的类路径中只有JTA1.1依赖项。当我尝试为WebSphere上的实体编制索引时,问题就出现了。@Benoit我的应用程序类路径中没有任何GemFire.jar。我不确定我是否完全理解你的评论。
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>