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

Spring Boot配置序列化:入参忽略id字段,返回时保留该字段

解决方法:区分请求入参和响应的字段序列化规则

针对你需求的「接收请求时忽略id,返回响应时包含id」,用Spring默认的Jackson序列化工具就能轻松实现,这里给你两种常用方案:

方案一:@JsonIgnore + @JsonProperty 组合注解

这种方法适合单个字段的简单控制,不需要额外定义视图类,直接在实体类上调整注解即可:

修改你的Student类:

@Getter
@Setter
public class Student {

    // 标记字段在反序列化(接收请求)时忽略
    @JsonIgnore
    private Long id;
    
    private String firstName;
    private String lastName;

    // 标记getter方法在序列化(返回响应)时输出id字段
    @JsonProperty("id")
    public Long getId() {
        return id;
    }
}

原理说明:

  • @JsonIgnore 加在字段上,会让Jackson在**反序列化(解析请求JSON)**时跳过这个字段,所以前端传的id参数不会被赋值到Student对象里;
  • 在getId()方法上添加@JsonProperty("id"),会让Jackson在**序列化(生成响应JSON)**时把id字段包含进去,这样返回给前端的结果就会有id值。

方案二:@JsonView 视图分组控制

如果你的实体类有很多字段需要区分输入输出,这种方法更灵活,通过定义视图接口来分组字段:

步骤1:定义视图接口

先创建一个包含输入、输出视图的类:

public class Views {
    // 输入视图:仅包含接收请求时需要的字段
    public interface Input {}
    // 输出视图:继承输入视图,额外包含返回时需要的字段
    public interface Output extends Input {}
}

步骤2:给实体类字段标记视图

修改Student类,给不同字段指定对应的视图:

@Getter
@Setter
public class Student {

    // 仅在输出视图中序列化
    @JsonView(Views.Output.class)
    private Long id;
    
    // 输入、输出视图都包含
    @JsonView(Views.Input.class)
    private String firstName;
    
    @JsonView(Views.Input.class)
    private String lastName;
}

步骤3:在Controller中指定视图

修改控制器方法,给入参和返回值分别指定视图:

@RestController
@RequestMapping("/student")
public class StudentController {

    @PostMapping(consumes = "application/json", produces = "application/json")
    public ResponseEntity<Student> post(
            // 接收请求时用Input视图,只解析指定字段
            @RequestBody @JsonView(Views.Input.class) Student student
    ) {
        // 模拟数据库保存后生成id
        student.setId(1001L);
        // 返回响应时用Output视图,序列化所有标记为Output的字段
        return new ResponseEntity<>(student, HttpStatus.CREATED);        
    }

}

原理说明:

  • @JsonView(Views.Input.class) 告诉Jackson在解析请求时,只处理标记了Input视图的字段(也就是firstName和lastName);
  • 返回的Student对象会自动用Output视图序列化,因为Output继承了Input,所以会包含firstName、lastName和id三个字段。

两种方案都能满足你的需求,你可以根据自己的场景选择:如果只是单个字段控制,方案一更简洁;如果有多个字段需要区分输入输出,方案二的扩展性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:12:05