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接口,自定义字符串到枚举的转换逻辑,忽略大小写:
- 编写读取转换器类
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()); } }
- 注册转换器到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
相关产品推荐
相关产品推荐

