3 Stimmen

Wo soll die Implementierung der Cross-Entity-Validierung erfolgen?

Ich habe ein Projekt, in dem das Datenmodell und die Geschäftsschicht in zwei verschiedenen Modulen befinden. Natürlich hat das Geschäftsmodul eine Abhängigkeit zum Modellmodul. Die Entity-Validierung wird durch Java-Validation-API-Annotationen implementiert.

Ich frage mich, wo ich die Validierung zwischen den Entitäten implementieren soll (Geschäftsvalidierung, bei der die Beziehungen zwischen verschiedenen Entitätstypen validiert werden). Aktuell sehe ich folgende Optionen:

  1. Erstellen von benutzerdefinierten javax.validation.ConstraintValidators und zugehörigen Annotationen. Das Problem ist, dass der Validator Zugriff auf die Geschäftsservices benötigen würde, um verwandte Entitäten abzurufen, aber das Modellmodul sollte keine Abhängigkeit vom Geschäftsmodul haben.
  2. Implementierung der Validierung zwischen den Entitäten in den Persist-/Merge-Methoden der Geschäftsservices (z. B. unter Verwendung von Interzeptoren). Das wäre möglich, aber die Validierung zwischen den Entitäten ist von der Entitätsvalidierung getrennt, und ich möchte nur eine Stelle für die Validierung haben.

Welche Option ist bevorzugt? Gibt es bessere Vorschläge?

Vielen Dank, Sebastian

1voto

Piotr Kochański Punkte 20846

Vom ideologischen Standpunkt aus betrachtet ist Ansatz 1. besser. Die Bean-Validierung arbeitet auf der Ebene des Modells (im Modell-View-Controller) und es ist nichts Falsches daran, wenn der Modellteil mit der Datenbank kommuniziert. So können zum Beispiel DAOs erstellt werden, die sowohl vom Service-Layer als auch von Modellvalidierern verwendet werden können, um Code-Duplizierung zu vermeiden.

Interceptors sind auch ein guter Ort, um etwas zu validieren, aber Sie werden nicht in der Lage sein, die volle Kraft und Automatik der Bean-Validierung zu nutzen. Wahrscheinlich müssen Sie die validate-Methode auf Ihren Modellobjekten manuell aufrufen, ConstraintViolationException werfen, wenn nötig, usw. Machbar, aber ein wenig Arbeit. Darüber hinaus wird wahrscheinlich ein Teil der Validierung im Modell verbleiben, so dass, wie Sie festgestellt haben, mehr als ein Ort vorhanden sein wird, an dem die Validierung durchgeführt wird.

Also würde ich den notwendigen DB-Code in eine separate Ebene verschieben und Option 1 wählen.

0 Stimmen

Wenn es mehr als nur Datenzugriffsmethoden in der separaten Ebene geben würde, d. h. komplexe Berechnungen, die für die Validierung erforderlich sind, würden Sie Option 2 vorziehen, oder eine andere?

0 Stimmen

Das Model ist auch der richtige Ort für komplexe Berechnungen, daher sollte immer noch 1. besser aussehen, wenn wir uns möglichst genau an das MVC-Modell halten wollen. Offensichtlich, wenn diese Berechnungen in einer Service-Schicht durchgeführt werden und es keinen Sinn macht, sie anderswohin zu verschieben, wäre es besser, 2. zu wählen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X