【发布时间】:2020-01-26 20:14:49
【问题描述】:
我有一个班级订单:
@Data
@Entity
public class Order {
private List<Project> projects;
// more fields
}
我的控制器中有两个 API 方法:
@GetMapping
public ResponseEntity<List<Order>> getOrders() {
return ResponseEntity.ok(orderService.getOrders());
}
@GetMapping("/{id}")
public ResponseEntity<Order> getOrder(@PathVariable long id) {
return ResponseEntity.ok(orderService.getOrder(id));
}
所以在这种情况下,projects 总是通过 JSON 发送,如果它存在,它只是被序列化,如果它不存在,它被懒惰地获取然后序列化。我可以通过用@JsonIgnore 注释字段来避免它被序列化。但问题是我有时想发送它,有时我不发送。例如在getOrders() 我不希望projects 被序列化。在getOrder(...) 中,我希望projects 被序列化。有没有办法在运行时在自定义代码中或通过注释告诉我想在一种特定情况下而不是在另一种情况下发送它?我唯一想到的是 - 在序列化之前不久 - 我可以用 null 初始化 projects 并用 @JsonInclude(JsonInclude.Include.NON_NULL) 注释实体。这样它就不会被发送,如果我想发送它,我可以避免用 null 初始化它。但显然我不想迭代 O(n) 中的每个 Order 只是为了将其 projects 初始化为 null。
【问题讨论】:
-
您可以使用Jackson JSON view 来指示何时反序列化该属性
-
我认为 Jackson 的
JsonDeserializer<T>专门用于此类目的。你试过吗?您可以查看this StackOverflow question。 -
创建一个视图模型对象并解析到它