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

