项目场景:
我们在实际开发过程中,往往一个项目对接的是多数据源。那么则需要在代码里配置类似DataSourceConfig
的类。
问题描述
网上搜了一堆mybatis-plus的枚举转换,最简单的是在枚举值上加
@EnumValue
注解;
@Getter
@AllArgsConstructor
public enum TestEnum implements IEnum<TestEnum> {
TEST_USER(0,"用户"),
TEST_ACCOUNT(1,"账户"),
;
/**
* 定义数字值.
*/
@EnumValue
private final int key;
/**
* 定义字符值.
*/
private final String strKey;
}
且在.yml或者.properties配置,(此处我是配置在nacos里的)
mybatis-plus:
type-enums-package:com.example.common.enums
但是实际不生效!依旧报错,数据库查找值映射不对。
原因分析:
这里就要回到上文项目背景了,因为采用多数据源所以引入了DataSourceConfig手动配置,所以直接配置.yml是不生效的。
解决方案:
在DataSourceConfig文件里手动增加配置
sqlSessionFactoryBean.setTypeEnumsPackage()
;
再用nacos配置具体值mybatis-plus: type-enums-package:com.example.common.enums
。
@Configuration
@Conditional(DefaultDataSourceCondition.class)
@EnableConfigurationProperties(MybatisPlusProperties.class)
@MapperScan(basePackages = DataSourcePoolConfig.PACKAGE, sqlSessionFactoryRef = "SqlSessionFactory")
public class DataSourceConfig {
/** mybatis 默认扫描路径. */
static final String PACKAGE = "com.example.common.mybatis.mapper";
/** mybatis 默认xml扫描路径. */
static final String MAPPER_LOCATION = "classpath:mapper/*.xml";
@Autowired
private MybatisPlusProperties properties;
/**
* 支持多数据源配置.
* @return
*/
@Bean("DB")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource1() {
return DataSourceBuilder.create().build();
}
@Bean("SqlSessionFactory")
public SqlSessionFactory mcSqlSessionFactory(@Qualifier("DB") final DataSource db) throws Exception {
final MybatisSqlSessionFactoryBean sqlSessionFactoryBean = getSessionFactoryBean(db,MAPPER_LOCATION,globalConfig);
final String typeEnumsPackage = this.properties.getTypeEnumsPackage();
if (StringUtils.isNotBlank(typeEnumsPackage)) {
sqlSessionFactoryBean.setTypeEnumsPackage(typeEnumsPackage);
}
return sqlSessionFactoryBean.getObject();
}
}