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

更新Trade实体ENUM状态时触发NullPointerException求助

问题分析与解决

核心问题

你遇到的NullPointerException,根源是JSON反序列化失败:
你在Postman传入的是韩文状态名"진행 중",但Spring默认只会根据枚举的英文名称(比如In_Progress)来反序列化,而你给枚举加的@JsonValue注解只负责序列化输出(把枚举转成韩文返回给前端),不处理反序列化。这就导致TradePatchDto里的status字段无法被正确赋值,最终为null,后续业务代码使用这个null值时就触发了空指针异常。

解决办法

方法1:给枚举添加反序列化支持(推荐,保留韩文传参)

在Status枚举中添加一个静态方法,用@JsonCreator标注,让Jackson知道如何通过韩文名称匹配枚举实例:

public enum Status {
    Waiting_Acceptance("수락대기"),
    In_Progress("진행 중"),
    Done("완료");

    @Getter
    @JsonValue
    private final String krName;

    Status(String krName) {
        this.krName = krName;
    }

    // 新增反序列化方法
    @JsonCreator
    public static Status fromKrName(String krName) {
        for (Status status : Status.values()) {
            if (status.getKrName().equals(krName)) {
                return status;
            }
        }
        throw new IllegalArgumentException("无效的状态值: " + krName);
    }
}

添加后,Jackson就能把传入的韩文"진행 중"正确解析为Status.In_Progress,TradePatchDto的status字段就不会为null了。

方法2:直接传枚举英文名称(快速测试用)

暂时修改Postman的请求体为枚举的英文名称,跳过反序列化配置:

{"status" : "In_Progress"}

额外检查

如果添加了上述配置后仍出现空指针,需要确认:

  • Controller层接收TradePatchDto时有没有加@Valid注解,确保@NotNull校验生效,提前拦截null值:
    @PatchMapping("/trades/{id}")
    public ResponseEntity<Void> updateTrade(@PathVariable Long id, @Valid @RequestBody TradePatchDto dto) {
        // 业务逻辑
    }
    
  • 业务代码中有没有对TradePatchDto的status做非空判断,避免直接使用null值。

内容的提问来源于stack exchange,提问作者Simba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:55:18