更新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
相关产品推荐
相关产品推荐

