Spring JPA出现BeanCreationException与AbstractMethodError问题求助
我帮你排查了一下,你遇到的BeanCreationException嵌套AbstractMethodError问题,核心原因是Spring框架版本冲突,下面给你详细分析和解决步骤:
问题背景
你定义了继承CrudRepository的IMyRepository接口:
public interface IMyRepository extends CrudRepository<MyEntity, Long> { // Queries }
并通过XML配置了Spring JPA相关Bean,但运行时出现初始化失败的错误,错误栈核心是java.lang.AbstractMethodError。
报错信息
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IMyRepository': Initialization of bean failed; nested exception is java.lang.AbstractMethodError at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:736) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4699) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5165) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1412) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1402) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.AbstractMethodError at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:99) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:302) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1477) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1222) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ... 20 more
核心原因
你引入的spring-boot-starter-data-jpa:2.0.5.RELEASE是基于Spring Framework 5.0.x版本的,但你同时手动添加了多个Spring 4.1.6.RELEASE的核心依赖(比如spring-core、spring-jdbc、spring-orm等)。
AbstractMethodError通常是因为运行时调用的方法在类的实际加载版本中不存在或签名不匹配:这里Spring Data JPA的组件(依赖Spring 5.x)试图调用Spring核心容器(你引入的是4.1.6)中新增的方法,但旧版本并没有这个方法,因此触发了错误。
解决方案
1. 移除手动添加的Spring 4.x依赖
spring-boot-starter-data-jpa已经包含了所有Spring JPA所需的核心依赖(比如spring-core、spring-jdbc、spring-orm等),并且会统一管理版本,不需要手动引入这些依赖,直接删除以下依赖:
spring-jdbc:4.1.6.RELEASEspring-core:4.1.6.RELEASEspring-context-support:4.1.6.RELEASEspring-orm:4.1.6.RELEASE
2. 替换Spring Test依赖
把单独的spring-test:4.1.6.RELEASE替换为Spring Boot提供的测试starter,它会自动匹配Spring Boot版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.0.5.RELEASE</version> <scope>test</scope> </dependency>
3. 检查自定义内部依赖
你的project-util和web-common依赖可能也引入了旧版本的Spring,需要通过mvn dependency:tree命令查看依赖树,排除其中冲突的Spring依赖:
<!-- 示例:排除project-util中的Spring依赖 --> <dependency> <groupId>com.project</groupId> <artifactId>project-util</artifactId> <version>0.0.2-SNAPSHOT</version> <scope>compile</scope> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
4. 可选:升级MySQL驱动版本
你当前使用的mysql-connector-java:5.1.6版本过旧,Spring Boot 2.0.x建议使用5.1.47及以上版本,避免兼容性问题:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> <scope>compile</scope> </dependency>
修改后的完整依赖示例
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.0.5.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.0.5.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.project</groupId> <artifactId>project-util</artifactId> <version>0.0.2-SNAPSHOT</version> <scope>compile</scope> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.51</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.project</groupId> <artifactId>web-common</artifactId> <version>1.0.5-SNAPSHOT</version> <scope>compile</scope> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
完成这些修改后,重新构建项目,应该就能解决这个Bean初始化的问题了。
内容的提问来源于stack exchange,提问作者Jake




