小编典典

Spring Boot JPA-不包含具有OneToMany关系的嵌套对象的JSON

spring-boot

我有一个项目,处理一些对象的ORM映射(存在一些@OneToMany关系等)。

我正在使用REST接口处理这些对象,并使用Spring JPA在API中管理它们。

这是我的一个POJO的示例:

@Entity
public class Flight {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;
  private String name;
  private String dateOfDeparture;
  private double distance;
  private double price;
  private int seats;

  @ManyToOne(fetch = FetchType.EAGER)
  private Destination fromDestination;

  @ManyToOne(fetch = FetchType.EAGER)
  private Destination toDestination;

  @OneToMany(fetch = FetchType.EAGER, mappedBy = "flight")
  private List<Reservation> reservations;
}

发出请求时,我必须在JSON中指定所有内容:

{
  "id": 0,
  "reservations": [
    {}
  ],
  "name": "string",
  "dateOfDeparture": "string",
  "distance": 0,
  "price": 0,
  "seats": 0,
  "from": {
    "id": 0,
    "name": "string"
  },
  "to": {
    "id": 0,
    "name": "string"
  }
}

我更希望的是实际上指定引用对象的ID而不是它们的整个主体,如下所示:

{
  "id": 0,
  "reservations": [
    {}
  ],
  "name": "string",
  "dateOfDeparture": "string",
  "distance": 0,
  "price": 0,
  "seats": 0,
  "from": 1,
  "to": 2
}

那有可能吗?有人可以给我一些如何做的见解吗?我只找到有关如何执行相反操作的教程(我已经拥有的解决方案)。


阅读 706

收藏
2020-05-30

共1个答案

小编典典

是的,有可能。

为此,您应该对实体模型使用一对Jackson注释:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIdentityReference(alwaysAsId = true)
protected Location from;

您的序列化JSON看起来将如下:

{
    "from": {
        "id": 3,
        "description": "New-York"
    } 
}

像这样:

{
    "from": 3
}

官方文档中所述

@JsonIdentityReference-
可选批注,可用于自定义对启用了“对象标识”的对象的引用的详细信息(请参阅JsonIdentityInfo

alwaysAsId = true 用作标记,指示是否所有参考值都将序列化为id(true);

请注意 ,如果使用值’true’,则反序列化可能需要其他上下文信息,并且可能需要使用自定义ID解析器-默认处理可能不够。

2020-05-30