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

问题描述 投票:0回答:3

我在尝试通过Websphere 8.5.5.10上的Hibernate5 Search API索引实体时遇到类强制转换异常。事务由Spring Transaction管理。文档实体已在本地tomcat上正确建立索引,但在WebSphere上却未正确建立索引。

我创建了一个RESTFUl Web服务调用来为实体建立索引。

春季4.2Hibernate Core 5.0.11.FinalHibernate Search 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>

以及Websphere应用程序日志中的堆栈跟踪:-

HSEARCH000058:HSEARCH000116:MassIndexer操作期间发生意外错误org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformException:无法获取WebSphere TransactionManager在org.hibernate.engine.transaction.jta.platform.internal.WebSphereJtaPlatform.locateTransactionManager(WebSphereJtaPlatform.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.ErrorHandledRunnable.run(ErrorHandledRunnable.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)在java.lang.Thread.run(Thread.java:798)原因:java.lang.ClassCastException:com.ibm.ws.tx.jta.TranManagerSet与javax.transaction.TransactionManager不兼容在org.hibernate.engine.transaction.jta.platform.internal.WebSphereJtaPlatform.locateTransactionManager(WebSphereJtaPlatform.java:63)

我不确定我在做什么错。除了Index Webservice调用之外,其他REST Webservice都运行良好,并且我的UI正在按预期填充。

任何帮助将不胜感激。

spring hibernate spring-transactions websphere-8 hibernate-search
3个回答
1
投票

根据this article,这是2个不同版本的java.transaction程序包之间的冲突(一个在Websphere中,一个在GemFire.jar中,它是随Websphere一起部署的库)。

它还建议解决方法:

从GemFire.jar中删除软件包javax.transactionzip -d gemfire.jar javax/transaction/*

希望这会有所帮助。


1
投票

我们遇到了这个问题。

问题:如果我们使用的是使用JPA 2.1的休眠版本(>休眠版本4.3),它将与Websphere的较早版本(没有JPA 2.1修订包的版本7、8.5)冲突。具体来说,您将看到的异常是:

nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()[Ljavax/persistence/Index;

解决方案1:解决此问题的一种方法是将类加载器设置为parent_last,以便使用随休眠一起提供的JPA 2.1。但是,您将遇到上述其他问题。

  1. 与休眠中附带的TransactionManager发生冲突,异常:

    java.lang.ClassCastException: com.ibm.ws.tx.jta.TranManagerSet incompatible with javax.transaction.TransactionManager

    这可以通过排除以下jar来解决(示例maven休眠依赖项的配置)冲突:

    <exclusion>
        <artifactId>jboss-transaction-api_1.2_spec</artifactId>
        <groupId>org.jboss.spec.javax.transaction</groupId>
    </exclusion>
    
  2. 与hibernate附带的xml-apis.jar冲突,导致异常:

    javax.xml.parsers.FactoryConfigurationError: Provider for javax.xml.parsers.DocumentBuilderFactory cannot be found

    这可以通过从休眠中排除xml-apis.jar来解决像这样的依赖:

    <exclusion>
        <artifactId>xml-apis</artifactId>
        <groupId>xml-apis</groupId>
    </exclusion>
    

解决方案2:使用自定义的PersistenceProviderResolver,以使Websphere类不会干扰Hibernate:

https://stackoverflow.com/a/37354979/5150013


0
投票

从SpringBoot 2.2.0.RELEASE版本开始,雅加达使用了事务管理器api。如果您想使其正常工作,请排除

<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>

基本思想是只有一名交易经理。在这里,我们从sprintboot-jpa中删除提供的一个

© www.soinside.com 2019 - 2024. All rights reserved.