在使用Sping Boot 时,一个常见的问题模式是缺少一个bean,尽管人们希望它由Sping Boot 创建。
如何调试这样的场景?如何找出为什么bean没有按预期创建?
- 注意:我创建了这个问题,它的答案来自question asking this for a special case。我希望这在各种情况下都有帮助。*
在使用Sping Boot 时,一个常见的问题模式是缺少一个bean,尽管人们希望它由Sping Boot 创建。
如何调试这样的场景?如何找出为什么bean没有按预期创建?
1条答案
按热度按时间sg2wtvxw1#
1.通过将
debug=true
添加到application.properties
文件来启用Sping Boot 的调试。这会在启动期间创建日志输出。对于每个可用的自动配置,它包含信息,如果它“匹配”或不,即它的先决条件是否满足,以及这些条件是什么。
1.特别是在输出的
Negative matches
部分中查找应该发生但没有发生的自动配置。在日志中搜索相关技术是一个好主意。1.在上一步中发现的自动配置可能会提示其他未激活的自动配置。对于这些自动配置,请重复步骤2。
以下是搜索https://github.com/iosenberg/todo/commit/c4cfbf63132e251ce98cfe02178bd48cc447aac7的示例,它在Spring boot can't find Repository bean中引用
缺少的bean是Spring Data JDBC存储库。因此,首先想到的是 * JDBC * 或 jdbc。搜索 JDBC 会产生以下相关结果:
字符串
这看起来像是有一个
DataSource
,这只是表明你不应该在第一个匹配上停止。下一场比赛是:
型
所以,
DataSourceAutoConfiguration
确实运行了,但我们似乎仍然没有DataSource
bean。从这里我们了解到,类可用和该类型的bean可用之间有一个重要的区别。当你大声说出来时,这是很明显的,但当你查看一些日志文件时,很容易忽略。剩下的搜索只找到了更多不起作用的东西,这些东西要么是不相关的,要么是不奇怪的,如果没有
DataSource
bean的话。这返回了大量的点击率。但是
Negative matches
中的第一个真的很有帮助。型
没有找到嵌入式数据库!它试图使用什么数据库?检查
application.properties
的JDBC URL显示没有。检查依赖项显示有一个嵌入式数据库,但只有范围test
,因此对于主程序没有可用的JDBC驱动程序。通过使内存中的数据库依赖项可用于主应用程序来解决这个问题。