使用Hibernate存储Bean时遇NoSuchMethodError问题求助
你遇到的NoSuchMethodError核心原因是版本严重不兼容:
- 你使用的
camel-hibernate:2.10.1是一个非常老旧的版本(对应Apache Camel 2.10,发布于2013年),它是为Hibernate 3.x设计的,调用的SessionFactory.getCurrentSession()方法返回的是org.hibernate.classic.Session类型。 - 而你搭配的Hibernate 5.x中,
SessionFactory.getCurrentSession()的返回类型已经改为org.hibernate.Session,并且方法签名发生了变化,导致旧版本的camel-hibernate组件找不到这个方法。
另外需要注意:org.apache-extras.camel-extra下的camel-hibernate分支早已停止维护,后续Hibernate组件已经合并到Apache Camel核心项目中。
因为你必须使用Spring Boot 1.5.x,我们需要选择兼容Spring Boot 1.5.x和Hibernate 5.x的Camel版本,推荐使用Camel 2.20.x系列(这是Spring Boot 1.5.x支持的最高稳定Camel版本),具体步骤如下:
1. 替换依赖
移除旧的org.apache-extras.camel-extra:camel-hibernate依赖,改用Apache Camel官方提供的Spring Boot starter:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-hibernate-starter</artifactId> <version>2.20.4</version> </dependency>
这个版本完全兼容Spring Boot 1.5.10.RELEASE和Hibernate 5.0.12.Final,并且已经解决了Hibernate 5的API适配问题。
2. 调整Spring配置类路径
如果你的配置中手动声明了HibernateComponent或SpringTransactionStrategy,需要将包路径从org.apacheextras.camel.component.hibernate改为org.apache.camel.component.hibernate,比如:
<bean id="hibernate" class="org.apache.camel.component.hibernate.HibernateComponent"> <property name="sessionFactory" ref="sessionFactory"/> <property name="transactionStrategy" ref="springTransactionStrategy"/> </bean> <bean id="springTransactionStrategy" class="org.apache.camel.component.hibernate.SpringTransactionStrategy"> <constructor-arg ref="sessionFactory"/> <constructor-arg ref="transactionTemplate"/> </bean>
(如果使用starter的自动配置,甚至可以省略这些手动配置,Camel会自动绑定你的SessionFactory和TransactionManager)
3. 清理依赖冲突
执行mvn dependency:tree检查依赖树,确保没有遗留的旧版本camel-hibernate或Hibernate 3.x/4.x依赖,如果有,通过<exclusion>排除它们。
修改完成后重新启动应用,这个NoSuchMethodError应该会消失,Hibernate存储Bean的功能可以正常工作。
内容的提问来源于stack exchange,提问作者user6640997

