我在尝试通过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正在按预期填充。
任何帮助将不胜感激。
根据this article,这是2个不同版本的java.transaction
程序包之间的冲突(一个在Websphere中,一个在GemFire.jar中,它是随Websphere一起部署的库)。
它还建议解决方法:
从GemFire.jar中删除软件包javax.transaction
:zip -d gemfire.jar javax/transaction/*
希望这会有所帮助。
我们遇到了这个问题。
问题:如果我们使用的是使用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。但是,您将遇到上述其他问题。
与休眠中附带的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>
与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:
从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中删除提供的一个