2016-09-29 2 views
2

Spring Boot (mit Jackson) behandelt Objekt Zuordnung zwischen einem JSON-Dokument und einem Java POJO recht gut. Zum Beispiel:Entity-Beziehungen in POSTed JSON mit Spring Boot

@PostMapping("/students/{id}") 
public Student Update(Long studentId, @RequestBody Student student) { 

    studentRepository.save(student); 

    return student; 
} 

und werden korrekt abgebildet in:

public class Student { 
    private Long id; 
    private String name; 
    ... 
} 

Aber was verschachtelte Modelle im JSON

{ id: 5, name: "Christopher" } 

kann angenommen werden?

{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A'} ] } 

Oder optionale Modelle im JSON?

{ id: 5, name: "Christopher" } 
(Purposefully leaving out 'grades', though it could be accepted.) 

Oder zeigt das Entfernen einer Zuordnung in JSON (Beispiel mit Rails '_ Destroy Flag)?

{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A', _destroy: true} ] } 

Oder eine Verknüpfung erstellen, indem Sie die ID weglassen?

{ id: 5, name: "Christopher", grades: [ {letter: 'A-'} ] } 

Unterstützt Spring Boot diese Ideen?

+0

Wenn Sie mit 'optionalen Modellen' somethink wie Optional was auch immer; Sie sollten keine Optionals in Pojos verwenden. –

+0

Nicht unbedingt optionale Modelle, nur optional, ob das in JSON sein sollte oder nicht. Wenn 'Student' eine Liste mit 'Grades' hat, ich aber nur den Namen eines Studenten aktualisieren möchte, möchte ich nicht jedesmal das 'Grades'-Array POST senden müssen. – Christopher

+0

Ich habe Data Transfer Object (DTOs) verwendet, um das von Ihnen beschriebene Problem zu lösen. Sie können auch @JsonIgnore-Annotation für Felder hinzufügen, die nicht serialisiert werden sollen. –

Antwort

1

Aber was ist mit verschachtelten Modellen in JSON?

Nested Modelle abgebildet werden, wie Sie vielleicht erwarten würde, vorausgesetzt, dass Sie das folgende Modell haben:

public class Product { 
    private String name; 
    private List<Price> prices; 
} 


public class ProductPrice { 
    Long idPrice; 
    Integer amountInCents; 
} 

Jackson würde die folgende JSON aus diesem Schema erstellen:

{ 
    "name":"Samsung Galaxy S7", 
    "prices":[ 
     { 
       "idPrice":0, 
       "amountInCents": 100 
     } 
    ] 
} 

Or optionale Modelle in JSON?

Sie können ein Feld mit @JsonIgnore annotieren. Wenn Sie beispielsweise die Preise mit @JsonIgnore kommentieren, werden keine Preise von jackson serialisiert.

oder Anzeigen der Entfernung eines Verbands in JSON (Beispiel Rails' _destroy Flag verwendet)?

Ich würde eine zusätzliche Zuordnung erstellen, um Assoziationen zu löschen. Dies hat den weiteren Vorteil, ist die API selbsterklärend ..

@DeleteMapping("/students/{id}/grade/{idGrade}") 
public Student Update(Long studentId, @PathVariable Long idGrade) { 

    studentService.deleteGrade(studentId,idGrade); 

    return student; 
} 

oder eine Vereinigung schaffen, indem die ID Weglassen?

Ich würde hier auch eine zusätzliche Mapping erstellen:

@PostMapping("/students/{id}/grade") 
public Student Update(Long studentId, @PathVariable String grade) { 

    studentService.addGrade(studentId,grade); 

    return student; 
} 

Hinweis: I-Repositories nicht direkt verwenden, erstelle ich eine Service-Schicht und jedes Repository hat Paket geschützten Zugriff.In der Service-Ebene erstellen Sie Methoden wie addGrade, deleteGrad, addStudent, deleteStudent und so weiter

+0

Danke, das ist eine ziemlich vollständige Antwort. Was aber, wenn ich ein verschachteltes Modell nur dann serialisieren möchte, wenn ich die Daten eingefügt habe? @JsonIgnore verhält sich so, als ob die Verknüpfung gar nicht existiert. Aber ich möchte vielleicht gleichzeitig ein Objekt mit seinem verschachtelten Objekt erstellen, oder ich möchte es auslassen. Wird dieses Verhalten unterstützt? – Christopher

+0

Ich habe es noch nie versucht, aber werfen Sie einen Blick auf Jackson JSON Views. Ich denke, das sollte zu deinen Zielen passen. Hier ist ein schöner Blogbeitrag: http://www.baeldung.com/jackson-json-view-annotation –