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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:45:00