jsf-forum.de jsf-forum.de jsf-forum.de
jsf-forum.de    
jsf-forum.de

Validierung

Validierung in Webanwendungen ist immer ein heißes Thema. Wird nur im Business-Layer validiert? Oder nur im UI-Layer, sprich mit den JSF-Validatoren? Dieses Thema wird selbst von erfahrenen Software-Architekten regelmässig und intensiv diskutiert ;-)
Korrekterweise muss mindestens in der Business-Schicht validiert werden. Eine Validierung im UI kann optional draufgesetzt werden. Das Problem ist nur, dass dann die Validierungsregeln redundant, vermutlich auch noch unter Verwendung unterschiedlicher Technologien, vorliegen.

JSF 2.0 geht hier neue Wege. Zusammen mit dem JSR-303 (Bean Validation) werden künftig Metadaten in Form von Annotations direkt an der Klasse angebracht und können in verschiedenen Layern dann verwendet werden. JSF 2.0 schaut beim Validieren von Managed Beans nach, ob an einer Eigenschaft JSR-303-kompatible Annotationen vorhanden sind.

Ein kleiner Hinweis noch: Damit auch null-Werte im Modell landen, obwohl in einem Eingabefeld ein Leerstring eingegeben wurde, kann in der web.xml ein Kontextparameter javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL eingetragen werden.

Der JSR-303 (Bean Validation API)
Der JSR-303 schickt sich an, einen Standard für die Validierung von Beans zu sein. Validierung ist ein zentrales Thema jeder Business-Anwendung, kommt sie zudem auch noch in verschiedenen Schichten vor. Zunächst wird meist in der Oberfläche eine erste Validierung durchgeführt. Anschließend wird dann aus dem UI-Controller eine Business-Funktionalität aufgerufen. In dieser muss natürlich auch nochmals validiert werden. Zu guter Letzt wird ein Bean dann noch persistiert, was erneut eine Validierung voraussetzt.
In der Vergangenheit kamen auf den verschiedenen Layern zum Teil unterschiedliche Technologien zum Einsatz, was zu Redundanzen oder - schlimmer - sogar zu unterschiedlichen Ergebnissen in der Validierung führte.
Um diesen Diskrepanzen vorzubeugen, gab es in der Vergangenheit durch verschiedene Frameworks bereits den Ansatz, die Validierung an einer zentralen Stelle zu definieren und in den jeweiligen Layern darauf zuzugreifen. Hibernate Validator beispielsweise führte Annotations ein, Jakarta Commons Validator definierte eine zentrale XML-Datei.

Mit dem JSR-303 wurde jetzt erstmal eine standardisierte API erarbeitet, mit der genau diese Anforderung umgesetzt werden kann - die Validierungslogik ist an einer zentralen Stelle, nämlich an der Klasse selbst zu finden.

Installation
JSF 2.0 unterstützt JSR-303, allerdings müssen die dazu notwendigen Bibliotheken ggf. separat in das Projekt mit eingebunden werden. Als Implementierung kann beispielsweise Hibernate Validator verwendet werden. Dies ist die Referenzimplementierung. Eine weitere Implementierung wäre agimatec. Im Folgenden verwende ich allerdings die Hibernate Variante. Alle notwendigen Bibliotheken können über die JBoss.org Website bezogen werden und werden einfach in das WEB-INF/lib Verzeichnis mit aufgenommen. Sind die Bibliotheken im Projekt eingebunden, kann mit den entsprechenden Annotations gearbeitet werden. JSF erkennt eine JSR-303 annotierte Klasse und führt in der Lifecycle-Phase "Process Validations" die Validierungen durch und zeigt Fehlermeldungen an.

Verwendung von Beans Validation
Der JSR-303 definiert sogenannte Contstraint-Annotationen, die direkt am Modell angehängt werden können. Hier ein erstes Beispiel:

public class ValidateBean {

   @Size(min=3)
   private String lastname;
   ...
}
In diesem Beispiel wird festgelegt, dass eine Variable "lastname" mindestens 3 Zeichen lang sein muss. Eine Annotation wäre prinzipiell auch an den Getter-Methoden möglich. Es ist jedoch ratsam, sich für eine der beiden Varianten zu entscheiden, da es ansonsten zu einer doppelten Validierung kommen könnte.
Folgend ein paar weitere Annotations, die standardmässig im JSR-303 erwähnt sind. Es ist natürlich auch vorgesehen, weitere Contraint-Annotations zu erstellen, aber davon sehen wir jetzt einmal ab ;-)
  • @AssertFalse
  • @DecimalMax
  • @Digists
  • @Future
  • @Max
  • @Min
  • @NotNull
  • @Past
  • @Pattern
  • @Size
  • @Valid

Abschließend sei noch erwähnt, dass die Bean Validation API auch eine sogenannte Group Validiation (Gruppenvalidierung) vorsieht. So kann es je nach Situation unterschiedliche Anforderungen an die Validierung eines Beans geben. Standardmässig gehören alle Constraints der Default-Gruppe an. Mit dem Attribut "groups" kann ein Constraint einer Gruppe zugeordnet werden.

Zurück zur Übersichtsseite

jsf-forum.de