美文网首页
IllegalArgument dataSource or da

IllegalArgument dataSource or da

作者: 王月亮17 | 来源:发表于2022-08-12 08:32 被阅读0次

    这阵子一直在修改之前同事遗留下来的老代码,今天遇到了这样一个错误:

    Error querying database.  Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.
    ### The error may exist in com/xxx/service/xxx/mapper/XXXMapper.java (best guess)
    ### The error may involve com.xxx.service.xxx.mapper.XXXMapper.selectXXX
    ### The error occurred while executing a query
    ### Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.] with root cause
    java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.
    

    这错误表面上一看很简单,就是数据库的配置问题,肯定是哪里配置错了。于是开始各种对配置,核对了properties文件、DataSourceConfig.java配置文件,都没有问题,于是开始百度。
    百度得到的答案几乎是一水地说SpringBoot1.0配置项是url,2.0配置项是jdbc-Url,但是并没有什么用。
    当时的项目的架构是十几个项目,大概架构如下,简略一些可以以3个项目概括吧:
    项目A、项目B,和项目大C。项目A和B打成jar包,放到项目大C下,启动项目大C对外提供服务(实际的项目复杂度远高于此,十几个项目相互交错错综复杂,令人头疼不已)。
    然后项目A和项目B两者互不依赖,但是两者需要用到一个相同的Mapper,于是当时两个项目下都有如下Mapper文件:

    image.png
    项目大C依赖项目A、B之后,启动并不会报错,但是只要调用到这个Mapper的方法,就会报文章开头的那个错误。
    究其原因,重点不在于配置项,而在于:
    image.png
    看到best guess就明白了,程序在猜测我到底想使用哪个Mapper,因为两个项目都有,而且路径和名称都相同。
    于是想到的第一个解决办法就是把名称改掉。
    但是改掉之后依然报同样的错误,可见直修改Mapper的名称行不通。
    于是干脆把路径和名称全部改掉。我把Mapper所在路径修改到其他路径下,然后把名称也改成和之前不一样的名称。然后这时候不要忘记改一下DataSourceConfig.java的扫包配置,否则找不到了:
    @Configuration
    @MapperScan(basePackages = {"com.xxx.service.xxx.mapper", "com.xxx.xxx.xxx.mapper.xxx"},sqlSessionFactoryRef = "xxxSqlSessionFactory")
    public class DataSourceConfig {}
    

    两份Mapper文件,不同路径,不同名称,basePackages配成两个,启动项目,再次请求,返回成功。
    至此这个错误就成功解决了。

    相关文章

      网友评论

          本文标题:IllegalArgument dataSource or da

          本文链接:https://www.haomeiwen.com/subject/zaambrtx.html