Spring Boot(使用 Jackson)可以很好地处理 JSON 文档和 Java POJO 之间的对象映射。例如:
{ id: 5, name: "Christopher" }
可以被接受:
@PostMapping("/students/{id}")
public Student Update(Long studentId, @RequestBody Student student) {
studentRepository.save(student);
return student;
}
并将正确映射到:
public class Student {
private Long id;
private String name;
...
}
但是 JSON 中的嵌套模型呢?
{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A'} ] }
或者 JSON 中的可选模型?
{ id: 5, name: "Christopher" }
(Purposefully leaving out 'grades', though it could be accepted.)
或者指示删除 JSON 中的关联(例如使用 Rails 的 _destroy 标志)?
{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A', _destroy: true} ] }
或者通过省略 ID 来创建关联?
{ id: 5, name: "Christopher", grades: [ {letter: 'A-'} ] }
Spring Boot 支持这些想法吗?
最佳答案
But what about nested models in the JSON?
嵌套模型的映射如您所料,假设您有以下模型:
public class Product {
private String name;
private List<Price> prices;
}
public class ProductPrice {
Long idPrice;
Integer amountInCents;
}
Jackson 将从该架构创建以下 JSON:
{
"name":"Samsung Galaxy S7",
"prices":[
{
"idPrice":0,
"amountInCents": 100
}
]
}
Or optional models in the JSON?
您可以使用@JsonIgnore 注释字段。例如,如果您使用 @JsonIgnore 注释价格,则不会从 jackson 序列化任何价格。
Or indicating the removal of an association in JSON (example using Rails' _destroy flag)?
我会创建一个额外的映射来删除关联。这还有另一个优点,API 是 self 解释的。
@DeleteMapping("/students/{id}/grade/{idGrade}")
public Student Update(Long studentId, @PathVariable Long idGrade) {
studentService.deleteGrade(studentId,idGrade);
return student;
}
Or creating an association by leaving out the ID?
我还会在这里创建一个额外的映射:
@PostMapping("/students/{id}/grade")
public Student Update(Long studentId, @PathVariable String grade) {
studentService.addGrade(studentId,grade);
return student;
}
注意:我不直接使用存储库,我创建了一个服务层,每个存储库都有包保护访问。在服务层中,您可以创建 addGrade、deleteGrad、addStudent、deleteStudent 等方法
关于java - POSTed JSON 中的实体关系与 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39775184/