自动数据同步后Spring枚举映射异常:No enum constant报错原因排查
问题描述
我们项目中有一个已使用多年且未做任何修改的枚举类,该类通过JPA映射数据库表的某一列。当前枚举类定义如下:
public enum Company { ACME, CYBERDYNE, INGEN, MONSTERS_INC }
对应的数据库表中有一个非空列,存储上述枚举值。今日完成自动数据同步后,系统抛出以下异常:
org.springframework.dao.InvalidDataAccessApiUsageException: No enum constant com.foo.bar.Company.
可能的原因
- 自动数据同步过程中,数据库列新增了未在枚举类中定义的取值。比如同步进来
WAYNE_ENTERPRISES这类枚举类里没有的内容,JPA尝试映射到Company枚举时找不到对应常量,触发异常。 - 数据同步出现大小写不匹配。比如数据库被写入
acme(小写),而枚举类里是ACME(大写),JPA默认严格匹配枚举名称,导致无法找到对应常量。 - 数据同步时绕过了数据库非空约束,写入了空值或无效空白字符。比如同步脚本临时禁用约束后,写入空字符串或全空格内容,JPA解析时无法匹配任何枚举常量。
- 枚举类的全类名(包路径)被修改,但数据同步的映射配置未同步更新,或者旧数据存储了基于旧全类名的枚举序列化值,导致加载时找不到对应枚举类。
- 自动同步工具对枚举值做了额外格式转换,比如把
MONSTERS_INC的下划线替换成空格变成MONSTERS INC,导致无法匹配枚举常量。
内容的提问来源于stack exchange,提问作者Alfergon
相关产品推荐
相关产品推荐

