2017-09-14 2 views
0

Ich entwickle eine einfache Wörterbuch RESTful API mit Spring-mvc. Es gibt zwei verbundene Unternehmen:Was ist die professionelle/Standardmethode zum Speichern eines Objekts mit einem Fremdschlüssel?

public class Word { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    private String word; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="LANGUAGE_ID", insertable=false, updatable=false) 
    private Language language; 

}

Basierend auf dem Code über der verbundene Einrichtung ist Language.

Problem: Ich möchte die Operation CREATE für die Word-Entität mit POST-Anfrage implementieren. Die Implementierung ist nicht schwierig, aber ich habe mindestens zwei Lösungskandidaten in Bezug auf die POST-Anfrage-URL und JSON-Anfragekörper gefunden:

Lösung Candicate I: direkt einfügen mit JSON Körper Anfrage. Die JSON Körper enthalten die verschachtelten JSON-Objekt - Sprache, so etwas wie

{id:1, word:"hello", Language: {id:1, language:"English"}}

Referenz: Spring: Save object with foreign keys with a POST request

Lösung Candidate II: die referenzierte Sprache id über die URL POST-Anfrage, so etwas sagen wie

POST http://localhost:8080/rest/language/1/words

Als solches gibt es kein Language Referenz a t alle im JSON POST-Anfragetext.

Referenz: https://www.youtube.com/watch?v=_Jnu_jHfQbM

Ich habe 2 Fragen:

Frage 1: unter diesen beiden Lösungskandidaten, die die bessere ist, oder sagen professionelle Standardlösung? oder gibt es eine andere lösung?

Frage 2: als sowohl der gegebenen Lösungskandidaten, in jedem Fall müssen wir die referenzierten Language POJO zumindest in der entsprechenden controller Klasse abzurufen. Aber aus der Sicht des OO-Design-Prinzips scheint dieser Weg eng mit dem Controller verbunden zu sein, also denke ich, sollten wir dieses Abrufverhalten anderswo als im Controller entkoppeln? zum Beispiel in der service Schicht. Aber ist das der professionelle Weg? und wir müssen einen entsprechenden DTO haben?

Antwort

0

Meiner Meinung nach müssen die Daten, die gespeichert werden sollen, im Hauptteil verschachtelt werden. Spring könnte die JSON-Daten direkt in ein Objekt mappen, und Sie müssen es nicht von einem Parameter auf eine andere Modellklasse festlegen.

Und ich würde separate Modellklassen für Ihre Entitäten erstellen. Der Controller füllt die Daten also mit den Modellklassen und gibt sie an einen Service weiter. Dann ordnet der Service die Modellklassen Entitäten zu. Danach könnten sie über Repositories gespeichert werden.

Beispiel:

@Controller 
public class RestController { 

    @Autowired 
    RestService restService; 

    @PostMapping(value="/") 
    public void saveVariable(@RequestBody TestModel testModel) { 
    testService.saveTest(testModel); 
    } 
} 

@Service 
public class RestService { 

    @Autowired 
    TestRespository testRepository; 

    public void saveTest(TestModel testModel) { 
    TestEntity testEntity = new TestEntity(); 
    //some mapping from testModel to testEntity 
    testRepository.save(testEntity); 
    } 
} 
+0

Danke zuerst für Ihren Ratschlag :) Was bedeutet "separate Modellklassen für Ihre Entitäten erstellen"? Ich hatte zwei getrennte Entitäten, sprich Sprache und Wort. U sollte ich wahrscheinlich DTO haben? Scheint das Testmodell, das du gegeben hast, ein bisschen DTO ist? – Rui

+0

Ja, ich mag es nicht, Entitäten in der Steuerung zu verwenden. Also erstelle ich eine separate Klasse, die die Werte der entsprechenden Entität enthält, die Sie benötigen. –

0

Unter der Annahme, dass Worte zu einer Sprache gehören, ich habe es wie folgt gestalten würde:

POST /api/languages/en/words HTTP/1.1 
Host: localhost:8080 
Content-Type: application/json 

{ 
    "word": "hello" 
} 

Wo eine Darstellung eines Wortes (ein JSON-Dokument, (zum Beispiel) wird in der Anfrage Payload an eine URL gesendet, die eine Hierarchie darstellt (eine Sprache hat Worte).

Sie könnten auch two-letter codes verwenden, um die Sprachen zu identifizieren, da es den Weg klarer als numerische Werte ist. Im obigen Beispiel bedeutet enEnglisch.


Ich rate Ihnen, Ausdauer Entitäten in Ihrem REST API und use DTOs statt auszusetzen. Ihre REST-Ressourcendarstellungen müssen nicht dieselben Attribute wie die Persistenzobjekte haben.

Halten Sie Ihre REST-Controller so schlank wie möglich und konzentrieren Sie sich auf Geschäftsregeln.

+0

Vielen Dank für Ihren Rat :) Großartig! – Rui

+0

Ihre Antwort ist auch OK. Aber die Antwort von Benjamin ist aus meiner Sicht akzeptabler, obwohl ich in den meisten Fällen Ihre Lösung wählen würde. Darüber hinaus kam Benjamins Antwort früher. Das tut mir leid :) – Rui

Verwandte Themen