配置正确spring-boot工程启动的时候报错dynamic-datasource Please check the setting of primary

一个两年没有碰的spring-boot工程,启动时报错。因为用了baomidou的多源数据库配置,因此启动时报错primary没有正确配置。经过检查,确定配置文件配置正确。

报错原因是没有读到正确的配置文件。pom文件里的resources标签重定义,把默认的resources文件路径覆盖了。解决方法是,在pom里加一个正确的resources配置,或者把之前的重写的resources删除掉使maven启用默认值。或者是在环境变量里加上spring.config.location,值为配置文件的绝对值。

我是这样定位问题的。

  1. 根据错误日志里的堆栈信息,定位到加载配置的类和函数。

    DynamicDataSourceAutoConfiguration类,dataSourceCreator函数。发现properties里的druid值全部为空。也就是说没有读到配置。

  2. 因为application-local.yml是我用的配置文件,在启动的日志中寻找The following profiles are active: local。发现使用的profile是default。也就是说在applciation.yml文件中的spring.profiles.active: local这一条没有起作用。

  3. 联想到以前同组同事的花活,在IDEA的环境变量里加上spring.active.profiles值设置成local。启动日志里成功地报了The following profiles are active: local。这下能找到application-local.yml了吗?

  4. **不能!**我在Spring core模块的加载配置类中打断点,ConfigFileApplicationListener类的Loader内部类的load方法打断点。发现不会进入到这个函数。

  5. 在IDEA的环境变量里加上spring.config.location值是resources/appplication-local.yml。发现file: application-local.yml文件的resource.exists返回false。也就是说没有这个文件。

    for(Resource resource:resources) {
    if (resource == null || resource.exists()) {...}

  6. what?我又把spring.config.location的值改成classpath:/resources/ 。依然无法读取到。

  7. 把值改成绝对路径,可以正确读取了。

问题解决了。

但是问题是怎么造成的?

这个工程的结构是这样的:

root => root-dependency => app => app-module

发现在root-dependency里有个配置:

复制代码
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.class</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
<!--            <resource>-->
<!--                <directory>src/main/resources</directory>-->
<!--                <includes>-->
<!--                    <include>**/*</include>-->
<!--                </includes>-->
<!--            </resource>-->
        </resources>

这个配置项重写了resource,如果没有这个配置,maven默认的effective pom是这样的:

复制代码
<resources>
  <resource>
    <directory>app-module的绝对路径\src\main\resources
    </directory>
  </resource>
</resources>

解决方法有两种,1 删除掉root-dependency里的resource配置。 2. 在app-module里加上src/main/resources配置。

spring boot读取配置文件的过程在这里有详细阐述:

https://www.cnblogs.com/lay2017/p/11484997.html

相关推荐
杭州杭州杭州8 小时前
瑞吉外卖项目
springboot
wyhwust13 小时前
如何让maven帮我们去下载合适的包
java·maven
逍遥德13 小时前
Java编程高频的“技术点”-03:“下划线命名”参数,后端用“驼峰命名“接收
java·后端·springboot
jiayong2313 小时前
Maven clean 报错与 Maven Profile 机制总结
java·maven
弹简特16 小时前
【Java项目-轻聊】08-用户管理模块-实现获取用户信息+头像上传+显示头像
java·开发语言·springboot
我登哥MVP18 小时前
Spring Boot 从“会用”到“精通”:请求映射原理
java·spring boot·后端·spring·servlet·maven·intellij-idea
我登哥MVP1 天前
Spring Boot 从“会用”到“精通”:Converter 原理
java·spring boot·servlet·maven·mybatis·converter
我登哥MVP2 天前
Spring Boo从“会用”到“精通”:Spring Boot 入门
java·spring boot·后端·spring·maven·intellij-idea·mybatis
我登哥MVP2 天前
Spring Boot 从“会用”到“精通”:自动装配原理
java·spring boot·后端·spring·tomcat·maven·intellij-idea
Al leng2 天前
注释旧依赖仍残留旧Jar四大原因+分步解决(IDEA+Maven)
java·maven·intellij-idea·jar