java 如何调试Sping Boot 自动配置

cld4siwp  于 2023-11-15  发布在  Java
关注(0)|答案(1)|浏览(128)

在使用Sping Boot 时,一个常见的问题模式是缺少一个bean,尽管人们希望它由Sping Boot 创建。
如何调试这样的场景?如何找出为什么bean没有按预期创建?

sg2wtvxw

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 会产生以下相关结果:

DataSourceAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)
      - @ConditionalOnMissingBean (types: io.r2dbc.spi.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   DataSourceTransactionManagerAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.transaction.TransactionManager' (OnClassCondition)

字符串
这看起来像是有一个DataSource,这只是表明你不应该在第一个匹配上停止。
下一场比赛是:

DataSourceInitializationConfiguration:
      Did not match:
         - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans (OnBeanCondition)
      Matched:
         - @ConditionalOnClass found required class 'org.springframework.jdbc.datasource.init.DatabasePopulator' (OnClassCondition)


所以,DataSourceAutoConfiguration确实运行了,但我们似乎仍然没有DataSource bean。从这里我们了解到,类可用和该类型的bean可用之间有一个重要的区别。当你大声说出来时,这是很明显的,但当你查看一些日志文件时,很容易忽略。
剩下的搜索只找到了更多不起作用的东西,这些东西要么是不相关的,要么是不奇怪的,如果没有DataSource bean的话。
这返回了大量的点击率。但是Negative matches中的第一个真的很有帮助。

DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration:
      Did not match:
         - EmbeddedDataSource did not find embedded database (DataSourceAutoConfiguration.EmbeddedDatabaseCondition)


没有找到嵌入式数据库!它试图使用什么数据库?检查application.properties的JDBC URL显示没有。检查依赖项显示有一个嵌入式数据库,但只有范围test,因此对于主程序没有可用的JDBC驱动程序。通过使内存中的数据库依赖项可用于主应用程序来解决这个问题。

相关问题