Spring java.lang.ClassCastException:com.ibm.ws.tx.jta.TranManagerSet与javax.transaction.TransactionManager不兼容

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

我在尝试通过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.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。但是,您将遇到与上述问题类似的其他问题

  • 与hibernate附带的TransactionManager冲突,异常:

    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>
    
  • 解决方案2:
    使用自定义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>