我有一个项目,处理一些对象的ORM映射(存在一些@OneToMany关系等)。
@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 }
那有可能吗?有人可以给我一些如何做的见解吗?我只找到有关如何执行相反操作的教程(我已经拥有的解决方案)。
是的,有可能。
为此,您应该对实体模型使用一对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解析器-默认处理可能不够。
@JsonIdentityReference- 可选批注,可用于自定义对启用了“对象标识”的对象的引用的详细信息(请参阅JsonIdentityInfo)
alwaysAsId = true 用作标记,指示是否所有参考值都将序列化为id(true);
alwaysAsId = true
请注意 ,如果使用值’true’,则反序列化可能需要其他上下文信息,并且可能需要使用自定义ID解析器-默认处理可能不够。