Es empfiehlt sich, Service Level Validierungsfehler dem Benutzer mit Spring MVC zu präsentieren

8

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?

    
xSNRG 28.01.2014, 17:44
quelle

2 Antworten

9

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

sein
  • ein ganzzahliger Code (schreckliche Idee)
  • eine Konstante aus einer geteilten Result enum (immer noch eine schlechte Idee wegen Wartbarkeit)
  • eine Konstante aus etwas spezifischerem wie zB 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)
  • Ein UserCreationResult -Objekt, das für diesen Aufruf völlig benutzerdefiniert ist (keine gute Idee, weil Sie eine Explosion davon bekommen)
  • ein 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.

    
Emerson Farrugia 28.01.2014, 18:17
quelle
5

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:

%Vor%

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.

    
Will Keeling 28.01.2014 21:10
quelle

Tags und Links