You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data MongoDB枚举大小写不敏感序列化/反序列化问题解决

解决MongoDB枚举字段大小写不匹配的反序列化问题

问题原因

你添加的spring.jackson.mapper.accept-case-insensitive-enums=true配置不生效,是因为Spring Data MongoDB默认不使用Jackson处理枚举转换,它直接调用Enum.valueOf()方法做字符串到枚举的映射,这个方法是大小写敏感的,所以数据库中大写的CREATED无法匹配枚举里小写的created,抛出No enum constant异常。

解决方案

下面提供两种可行的解决方法,任选其一即可:

方法一:自定义MongoDB读取转换器

通过实现Spring Data的Converter接口,自定义字符串到枚举的转换逻辑,忽略大小写:

  1. 编写读取转换器类
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;

// 标记为读取转换器,用于从MongoDB读取数据时执行转换
@ReadingConverter
public class StringToAccountStatusEnumConverter implements Converter<String, AccountStatusEnum> {
    @Override
    public AccountStatusEnum convert(String source) {
        if (source == null || source.isBlank()) {
            return null;
        }
        // 将数据库字符串转小写后匹配枚举常量
        return AccountStatusEnum.valueOf(source.trim().toLowerCase());
    }
}
  1. 注册转换器到Mongo配置
    创建Mongo配置类,把自定义转换器加入到Mongo的自定义转换列表中:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import java.util.List;

@Configuration
public class MongoConfig {
    @Bean
    public MongoCustomConversions mongoCustomConversions() {
        return new MongoCustomConversions(List.of(new StringToAccountStatusEnumConverter()));
    }
}

方法二:修改枚举类,添加兼容解析逻辑

在枚举类中添加静态方法,实现忽略大小写的字符串解析:

修改AccountStatusEnum枚举:

public enum AccountStatusEnum {
    created,
    failed,
    inprogress;

    // 静态方法:忽略大小写解析输入字符串
    public static AccountStatusEnum parseIgnoreCase(String input) {
        if (input == null) {
            return null;
        }
        String normalized = input.trim().toLowerCase();
        for (AccountStatusEnum status : values()) {
            if (status.name().equals(normalized)) {
                return status;
            }
        }
        throw new IllegalArgumentException("No enum constant for input: " + input);
    }
}

然后配合MongoDB的自定义转换器使用(逻辑同方法一,只是转换时调用这个静态方法),或者在实体类字段上通过@Field配合转换逻辑,不过方法一的实现更简洁通用。

验证

完成配置后,再次调用userAccountRepo.findById(id),数据库中的CREATED、created甚至Created都会被正确转换为对应的AccountStatusEnum枚举常量。

内容的提问来源于stack exchange,提问作者Prathap H N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:25:21