【踩坑记录:Mybatis-Plus枚举类型处理器,@EnumValue不生效?多数据源解决方案】

本文讲述了在项目开发中,遇到mybatis-plus枚举转换不生效的问题,原因是项目使用了多数据源并手动配置DataSourceConfig。解决方法是在DataSourceConfig中添加sqlSessionFactoryBeansetTypeEnumsPackage(),指定枚举包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

我们在实际开发过程中,往往一个项目对接的是多数据源。那么则需要在代码里配置类似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();
    }
}
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。在使用 MyBatis-Plus 进行开发时,@EnumValue 注解通常用于自动填充枚举类型的字段值。然而,当你想要通过 HTTP 请求中的 @ResponseBody 提交 JSON 数据时,直接使用 @EnumValue 注解可能无法正常工作,因为它是设计来在 MyBatis-Plus 的自动填充机制中使用的,而不是直接与 Spring MVC 的请求处理交互。 要解决这个问题,你可以采取以下步骤: 1. 自定义枚举转换器:实现 `WebMvcConfigurer` 接口,并重写 `addFormatters` 方法,添加一个自定义的 `ConversionService`,用于处理枚举类型字段的转换。 2. 在自定义枚举转换器中,注册枚举类型的转换器,这样 Spring MVC 就能在请求处理过程中将字符串转换为对应的枚举对象。 下面是一个简单的示例代码: ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new Converter<String, YourEnumType>() { @Override public YourEnumType convert(String source) { return YourEnumType.valueOf(source); } }); } } ``` 在这个示例中,你需要将 `YourEnumType` 替换为你需要转换的枚举类的名称。这样,当 Spring MVC 接收到含有枚举类型字段的 JSON 数据时,会使用你的自定义转换器来将字符串转换为枚举对象。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值