Spring Boot保存包含枚举的实体时出现JSON解析错误400如何解决?
问题根因
你的枚举配置存在规则冲突,标注在int value字段上的@JsonValue注解优先级高于类上的@JsonFormat注解,会强制Jackson在序列化时仅输出value对应的整数值,同时要求反序列化时入参必须是0~11的整数。而实际请求中WebClient传递的是"JAN"这类枚举名字符串,类型不匹配触发了反序列化异常。
解决方案
根据你的业务需求选对应方案即可:
方案1:前后端统一用数字做序列化/反序列化
保证WebClient调用端的Month枚举定义和服务端完全一致,补上相同的@JsonValue注解,确保WebClient序列化枚举时输出的是数字而非字符串即可。
方案2:前后端统一用枚举名(JAN/FEB等)做序列化/反序列化
直接删除枚举上的两个冲突注解即可,Jackson默认会使用枚举名做序列化和反序列化:
// 删掉这两个注解 // @JsonFormat(shape = JsonFormat.Shape.OBJECT) // @JsonValue private final int value;
方案3:兼容数字、枚举名两种入参,序列化仍输出数字
保留原有@JsonValue注解的同时,给枚举新增一个兼容两种入参的反序列化构造方法,标注@JsonCreator注解:
@JsonCreator public static Month parse(Object obj) { if (obj instanceof Integer intVal) { return fromInt(intVal); } else if (obj instanceof String strVal) { return Month.valueOf(strVal); } return null; }
该方案下服务端既能接收数字入参,也能接收枚举名字符串入参,返回时仍输出数字,兼容性最强。
注意事项
如果不需要将枚举序列化为包含所有字段的完整对象,请删除类上的@JsonFormat(shape = JsonFormat.Shape.OBJECT)注解,该配置在你当前的场景下无实际作用,反而会引入不必要的规则冲突。
内容的提问来源于stack exchange,提问作者user2304483
相关产品推荐
相关产品推荐

