1. 数据库连接问题:90%错误的根源
遇到"Error creating bean"报错时,我建议你第一时间检查数据库连接配置。根据我的实战经验,这类问题90%都出在数据库或Redis的连接参数上。最常见的症状就是启动时抛出RedisConnectionFailureException或CannotGetJdbcConnectionException。
先打开你的application.yml(或application-druid.yml),重点检查这几个参数:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/ry-vue?useSSL=false
username: root
password: 123456 # 这里最容易出错
redis:
host: 127.0.0.1
port: 6379
password: your_redis_password # 空密码也要确认
我踩过的一个典型坑是:开发环境用空密码,但生产环境有密码却忘记配置。更隐蔽的问题是MySQL 8.0+需要显式关闭SSL(useSSL=false),否则可能报SSL handshake错误。另外注意url中的时区参数,建议加上&serverTimezone=Asia/Shanghai。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MyBatis映射文件:XML的暗礁
当数据库连接正常但依然报错时,就该检查MyBatis映射了。常见症状是日志中出现NoSuchBeanDefinitionException或Invalid bound statement。
关键检查点:
- XML文件位置:必须放在resources/mapper/对应模块目录下
- namespace匹配:必须与Mapper接口全限定名一致
- 方法ID唯一性:我曾遇到两个XML文件定义了相同id的select语句
xml复制<!-- 正确示例 -->
<mapper namespace="com.ruoyi.system.mapper.SysConfigMapper">
<select id="selectConfigList" resultType="SysConfig">
select * from sys_config
</select>
</mapper>
特别提醒:如果修改了Mapper接口的包路径,记得同步更新XML中的namespace。我建议用IDE的全局搜索功能检查所有XML文件,比肉眼排查高效得多。
3. Bean依赖注入:Spring的拼图游戏
当看到UnsatisfiedDependencyException时,说明Spring的依赖注入出问题了。这类问题通常有三种情况:
-
缺少注解:
- Service实现类需要
@Service - Mapper接口需要
@Mapper或在启动类加@MapperScan
- Service实现类需要
-
循环依赖:
java复制// 典型错误示例 @Service public class AService { @Autowired private BService bService; } @Service public class BService { @Autowired private AService aService; // 形成循环 } -
初始化顺序问题:
使用@PostConstruct的方法如果依赖其他Bean,可能因初始化顺序导致NPE。我常用的解决方法是改用@EventListener(ContextRefreshedEvent.class)。
4. 配置与注解:魔鬼在细节中
最后这类问题最隐蔽,我总结了几种典型场景:
案例1:Redis配置缺失
yaml复制# 错误配置示例
spring:
redis:
host: localhost
# 忘记配password但Redis服务器需要密码
案例2:包扫描遗漏
java复制// 启动类必须覆盖所有组件包
@SpringBootApplication(scanBasePackages = "com.ruoyi")
public class RuoYiApplication {
public static void main(String[] args) {
SpringApplication.run(RuoYiApplication.class, args);
}
}
案例3:缓存配置冲突
java复制@Service
public class SysConfigServiceImpl {
@Cacheable(key = "#configKey") // 需要Redis但未配置
public String getConfig(String configKey) {
return configMapper.selectByKey(configKey);
}
}
遇到这类问题,建议按以下步骤排查:
- 检查启动类注解是否完整
- 确认各层组件(Controller/Service/Mapper)都有正确注解
- 验证第三方组件(Redis/MQ等)的配置参数
- 查看pom.xml是否缺少必要依赖
5. 实战排查工具箱
根据多年踩坑经验,我整理了一套高效排查流程:
-
日志分析三板斧:
- 搜索"Caused by"找到根本原因
- 关注第一个"Error creating bean"报错
- 查看Bean初始化失败的堆栈信息
-
断点调试技巧:
在Bean的构造方法和@PostConstruct方法打断点,观察Spring容器的创建过程 -
依赖检查命令:
bash复制# 查看所有已注册的Bean curl http://localhost:8080/actuator/beans -
配置校验方法:
java复制@RestController public class ConfigCheckController { @Value("${spring.datasource.url}") private String dbUrl; @GetMapping("/checkConfig") public String check() { return "DB URL: " + dbUrl; } }
记住一个原则:Spring的报错信息虽然冗长,但越往下的"Caused by"通常越接近真实原因。耐心阅读日志,你一定能找到线索。
