Gibt es einige bewährte Vorgehensweisen, um Service-Layer-Validierungsfehler mithilfe von Spring MVC zu präsentieren, nachdem die Validierung der Benutzereingaben mithilfe von Spring MVC Validators durchgeführt wurde? Zum Beispiel mit diesem Code:
%Vor%Obwohl es am Beispiel dieses Codes trivial erscheint, scheint es für mich eine heikle Geschichte zu sein, wenn die Validierung auf der Serviceebene eine komplexe Aufgabe ist. Obwohl es ein absurdes Szenario ist, kann der UserService eine Liste von zu erstellenden Benutzern erstellen, und wenn eine von ihnen bereits existiert, muss die Ansichtsebene irgendwie darüber informiert werden, welche von ihnen nicht gültig ist (zB existiert sie bereits).
Ich suche nach einer guten Übung, wie man ein Stück Code entwirft, was es möglich macht,
1) behandelt Validierungsfehler auf der Service-Schicht mit komplexen Daten als Eingabe und
2) um diese Validierungsfehler dem Benutzer zu präsentieren
so einfach wie möglich. Irgendwelche Vorschläge?
Die Auswahl besteht normalerweise aus Ausnahmen gegenüber Fehlercodes (oder Antwortcodes), aber die beste Vorgehensweise, zumindest Bloch, besteht darin, Ausnahmen nur in Ausnahmefällen zu verwenden, die sie in dieser Situation disqualifizieren, da ein Benutzer einen vorhandenen Benutzernamen auswählt ist nicht unbekannt.
Das Problem in Ihrem Serviceaufruf besteht darin, dass Sie davon ausgehen, dass createUser
ein imperativer Befehl ohne Rückgabewert ist. Sie sollten es als "versuchen, einen Benutzer zu erstellen, und geben Sie mir ein Ergebnis" statt. Dieses Ergebnis könnte dann
UserOperationResult
enum (bessere Idee, da Sie USER_ALREADY_EXISTS
sowohl beim Erstellen eines neuen Benutzers als auch beim Versuch, einen Benutzer zu ändern, zurückgeben möchten) UserCreationResult
-Objekt, das für diesen Aufruf völlig benutzerdefiniert ist (keine gute Idee, weil Sie eine Explosion davon bekommen) Result<T>
oder UserOperationResult<T>
-Wrapper-Objekt, das eine Antwortcode-Konstante ( ResultCode
bzw. UserOperationResultCode
) und einen Rückgabewert T
oder einen Platzhalter ?
kombiniert, wenn kein Rückgabewert vorhanden ist. .. Achte nur auf Pointcuts und ähnliches, die den Wrapper nicht erwarten) Das Schöne an ungeprüften Ausnahmen ist, dass sie all diesen Mist vermeiden, aber sie haben ihre eigenen Probleme. Ich würde mich persönlich an die letzte Option halten und hatte in der Vergangenheit Glück gehabt.
Eine Alternative zum Auslösen einer Ausnahme / Zurückgeben eines Fehlercodes wäre das Übergeben der Errors
an userService.createUser()
. Die doppelte Überprüfung des Benutzernamens könnte dann auf der Service-Ebene durchgeführt werden - und jeder Fehler, der an die Errors
angehängt wurde. Dies würde sicherstellen, dass alle Fehler (oberflächlich und komplex) gesammelt und gleichzeitig der Ansicht präsentiert werden können.
So könnten Sie Ihre Controller-Methode leicht überarbeiten:
%Vor% Und Ihr UserServiceImpl
würde dann nach doppelten Benutzern suchen - zum Beispiel:
Die Errors
-Klasse ist Teil des Validierungs-Frameworks von Spring. Obwohl es eine Abhängigkeit von Spring geben würde, hätte die Service-Schicht keine Abhängigkeit von web-bezogenem Code.
Tags und Links java spring spring-mvc validation