Best Practice Saubere Verbindung zwischen API und Business Layer mit DTO's

igreex

Neues Mitglied
Guten Abend zusammen

Ich baue gerade eine Rest API mit Java (11) und Spring Boot und hadere seit Stunden mit dem gleichen Problem/Frage.

Ich habe POJO's für die Request Body's und DTO's für die Übergabe der Daten zwischen API und Business Layer. Der Service im Business Layer empfängt die DTO's mit folgenden zwei Methoden: `create(UserDTO user)`, `update(Long userId, UserDTO user)`.

Aktuell ist es so, dass ich mittels Mapper aus dem Request Objekt ein DTO erstelle und dieses dann an den Service gebe. Beim `create()` ist es ja ziemlich einfach, da ich dann einfach alle Felder verwende und daraus die Entität auf der DB erstelle.

Knifflig wirds nun beim `update()`. Wie erkenne ich am Besten, welche Felder sich im DTO geändert haben. Soll ich in der Methode im Service zuerst die Entität holen und dann Schritt für Schritt jedes Attribut durchgehen und schauen, ob es nicht gleich ist, oder einfach verschiedene Methoden im Service machen, bei welchen ich dann genau weiss, dass sie z.B. beim UserUpdate Endpoint aufgerufen werden?
 
Ich selbst habe so etwas mal mit speziellen Holder-Objekten gemacht, die den ursprünglich aus der DB gelesenen Wert gespeichert hatten.

Im Multi-User-Betrieb ist das Lesen vor Update sicherer, eventuell wurde der Datensatz von jemand anderem geändert.

In einem anderen Projekt, das damals auf dem gleichen Flur lief, haben sie Change-Listener nach der Java-Bean-Spezifikation benutzt, eventuell auch eine Lösung.
 
Deutlich sauberer wird das schon mal, wenn man explizite Klassen für verschiedene Operationen nutzt. Also nicht ein generisches UserDTO, was je nach Kontext was anderes ist, sondern zB ein CreateUserDto (wenn man bei der Dto-Benennung bleiben will), ein UpdateUserDto etc.


Biete an der Schnittstelle von Business-Layer und API Methoden an, die den Business-Funktionalitäten entsprechen, und nicht nur ein generisches "mache irgendwas".
Also z.B:
Der Nutzer kann seine Daten ändern => updateUser
Der Nutzer kann sein Passwort ändern => changePassword
Like-Count des Nutzers ändert sich (wie zb hier im Forum bei "Likes") => addLike/removeLike/setLikeCount o.ä.
 

Zurück
Oben