java - POSTed JSON 中的实体关系与 Spring Boot

标签 java json spring jackson

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/

相关文章:

java - 在始终打开的 Eclipse 上执行 SilkTest 操作?

java - Android 中的运动检测器

java - 如何使用多线程创建 gremlin 边

java - ArrayList<Integer> 的排列

c# - 无法从 ASP.NET MVC 中的 IEnumerable 获取 JSON

java - 使用gson解析json出现空指针异常

java - 在 JUnit 规则运行之前使用 Spring TestExecutionListener 初始化状态

c# - JSON.NET 序列化列表作为父对象的属性

hibernate 异常 : Connection Pool exhausted error after Spring upgrade

java - 将用户重定向到他在 Spring MVC 中来自的同一位置