这阵子一直在修改之前同事遗留下来的老代码,今天遇到了这样一个错误:
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文件:
项目大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配成两个,启动项目,再次请求,返回成功。
至此这个错误就成功解决了。
网友评论