前言
在使用magicapi的过程中,有一次,我想将magicapi的脚本数据存储在非默认的数据源,因为要做脚本备份这些,想放在一个单独的数据库,但是按照官方文档配置之后,总是报错,提示找不到数据源。
magic-api:
web: /magic-api
resource:
type: database
tableName: magic_api_file # 数据库中的表名
datasource: slave#指定数据源(单数据源时无需配置,多数据源时默认使用主数据源,如果存在其他数据源中需要指定。)
prefix: /magic-api # key前缀
readonly: false # 是否是只读模式
backup: #备份相关配置
enable: true #是否启用
max-history: -1 #备份保留天数,-1为永久保留
table-name: magic_backup_record #使用数据库存储备份时的表名
这里的多数据源是ruoyi里边配置的druid的多数据源
分析
这里抛出一个数据源找不到的异常,经过源码分析,发现异常的来源
/**
* 获取数据源
*
* @param datasourceKey 数据源Key
*/
public MagicDynamicDataSource.DataSourceNode getDataSource(String datasourceKey) {
if (datasourceKey == null) {
datasourceKey = "";
}
MagicDynamicDataSource.DataSourceNode dataSourceNode = dataSourceMap.get(datasourceKey);
Assert.isNotNull(dataSourceNode, String.format("找不到数据源%s", datasourceKey));
return dataSourceNode;
}
这是magicapi的数据源管理类,将数据源组成进MagicDynamicDataSource然后从中获取数据源
报这个错误的原因是,在magicapi初始化数据源时,只是把默认数据源放进了这个类
从MagicModuleConfiguration可以看到
/**
* 注入动态数据源
*/
@Bean
@ConditionalOnMissingBean(MagicDynamicDataSource.class)
public MagicDynamicDataSource magicDynamicDataSource(@Autowired(required = false) DataSource dataSource) {
MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
if (dataSource != null) {
dynamicDataSource.put(dataSource);
} else {
logger.warn("当前数据源未配置");
}
return dynamicDataSource;
}
这里有一个@ConditionalOnMissingBean(MagicDynamicDataSource.class),意思是,当springboot里没有这个类的时候,就执行这个方法来创建MagicDynamicDataSource
解决
所以,我们只需要创建一个配置类重写这个方法,自己来初始化类,放入我们的数据源就可以了
/**
* 注入动态数据源
*/
@Bean
@ConditionalOnMissingBean(MagicDynamicDataSource.class)
MagicDynamicDataSource magicDynamicDataSource(@Autowired(required = false) DataSource dataSource) {
MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
if (dataSource != null) {
DruidDataSource mgicdb = new DruidDataSource();
mgicdb.setUrl(url);
dynamicDataSource.put(dataSource);
dynamicDataSource.put("slave",mgicdb);
try {
Db db = Db.use(mgicdb);
if(StrUtil.isNotBlank(tabName)) {
db.execute(StrUtil.format("create table if not exists {}(file_path primary key,file_content)",tabName));
}
if(StrUtil.isNotBlank(backUpTabName)) {
db.execute(StrUtil.format("create table if not exists {}(id,create_date,tag,type,name,content,create_by,primary key(id,create_date))",backUpTabName));
}
} catch (SQLException e) {
e.printStackTrace();
}
} else {
logger.warn("当前数据源未配置");
}
return dynamicDataSource;
}
我这里是自己配置了一个sqlite的数据源,并且使用hutool的Db模块初始化了表结构,实际使用的过程中,根据自己的情况来修改就可以了。