SpringBoot启动报错"Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException: Err"

本文记录了解决Mybatis映射接口Bean创建失败的问题过程。作者在一个项目中遇到无法创建Mybatis映射接口Bean的异常,通过排查发现是由于pom.xml文件中引入了两个Mybatis依赖导致的冲突。最终解决方案是移除与Spring整合的Mybatis依赖。

启动报如下异常:无法创建Mybatis的映射接口Bean类

Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'userDaoMapper' defined in file [E:\WebProject\

这里写图片描述

这个问题找了我两天左右的时间,又是改注解又是重新写一个项目Demo来排查这个问题
后来才在poml文件找到问题所在.问题是我poml文件引入了两个Mybatis依赖包.一个是整合SpringBoot的,一个是整合Spring的jar包.两个一起出现,起冲突了

这里写图片描述

把Spring的Mybatis去掉既可以了!

### 解决 Tomcat 启动时出现 `UnsatisfiedDependencyException` 和 `StackOverflowError` 的问题 #### 1. 问题分析 在 Spring Boot 应用中,`org.springframework.beans.factory.UnsatisfiedDependencyException` 表示某个 Bean 的依赖未被正确解析。这通常与以下几种情况有关: - **Bean 定义冲突**:可能存在多个同名或同类型的 Bean,导致 Spring 无法确定注入哪个 Bean。 - **循环依赖**:两个或多个 Bean 相互依赖,形成闭环,可能导致栈溢出错误。 - **配置错误**:某些自动配置类(如 RedisAutoConfiguration)可能因初始化逻辑复杂而触发栈溢出。 此外,当应用从本地部署到服务器时,如果 JVM 参数(如 `-Xss`)设置不当,也可能引发 `StackOverflowError`[^2]。 #### 2. 解决方案 ##### (1) 检查 Feign 客户端的包扫描范围 如果使用了 Feign 客户端,确保启动类上正确指定了 `@EnableFeignClients` 的包扫描范围。例如: ```java @EnableFeignClients(basePackages = {"com.lydsoft.eip.mapp.cmc.service.feign", "com.lydsoft.eip.mapp.common.feign"}) @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 此配置可以避免因 Feign 客户端未被正确扫描而导致的依赖注入失败问题[^1]。 ##### (2) 调整 JVM 栈大小参数 如果服务器上的 JVM 默认栈大小过小,可能会导致复杂的初始化逻辑(如 Redis 配置)触发栈溢出。可以通过增加 `-Xss` 参数来解决: ```bash java -Xss2m -jar your-application.jar ``` 此操作将栈大小从默认值(通常是 1M)提升至 2M,从而减少栈溢出的可能性[^2]。 ##### (3) 分析并修复循环依赖 如果存在循环依赖,可以通过以下方式解决: - **构造器注入改为 Setter 注入**:Spring 在处理构造器注入时会更早地尝试解析依赖,因此可能更容易触发循环依赖问题。改为 Setter 注入可以延迟依赖解析。 - **引入中间层**:通过引入一个中介 Bean 来打破循环依赖关系。例如: ```java @Service public class ServiceA { private final ServiceB serviceB; public ServiceA(ServiceB serviceB) { this.serviceB = serviceB; } } @Service public class ServiceB { private final ServiceA serviceA; public ServiceB(ServiceA serviceA) { this.serviceA = serviceA; } } ``` 上述代码会导致循环依赖。可以通过引入一个中介类来解决: ```java @Component public class ServiceAMediator { private final ServiceB serviceB; public ServiceAMediator(ServiceB serviceB) { this.serviceB = serviceB; } public ServiceA createServiceA() { return new ServiceA(serviceB); } } ``` ##### (4) 检查 Redis 配置 如果项目中使用了 Redis,且初始化逻辑较复杂,可能需要优化其配置。例如,检查 `RedisAutoConfiguration` 是否包含不必要的递归调用。可以通过自定义配置类覆盖默认行为: ```java @Configuration public class CustomRedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); return template; } } ``` ##### (5) 捕获并记录异常 为了更好地定位问题,可以在 `application.properties` 或 `application.yml` 中启用详细的日志记录: ```properties logging.level.org.springframework.beans.factory=DEBUG logging.level.org.springframework.context=DEBUG ``` 这将帮助识别具体的依赖注入失败原因。 #### 3. 示例代码修正 假设 `feignConfiguration` 的依赖未被正确解析,可以通过以下方式调整: ```java @Configuration public class FeignConfig { @Bean public Contract feignContract() { return new SpringMvcContract(); } } ``` 同时,确保 `application.properties` 中正确配置了 Feign 客户端: ```properties feign.client.config.default.connect-timeout=5000 feign.client.config.default.read-timeout=5000 ``` ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值