Spring ToolBox: Bean- und Methoden Validierung

Das Spring-Framework ist wie ein Schweizer Messer für Java-Entwickler: Es stellt für viele im Programmieralltag aufkommende Problemstellungen eine fertige Lösung zur Verfügung. Dabei stolpert man selbst nach jahrelangem Einsatz immer wieder über Funktionen des Frameworks, die man bisher nicht kannte und für die man stattdessen eigene Implementierungen geschrieben hat. Ein Beispiel hierfür ist die Nutzung der Validierung nicht nur für Attribut-Validierung, sondern auch zum Überprüfen von Parametern und Return-Werten von Methodenaufrufen.

Bean Validation

Im Java Umfeld ist die Bean Validierung seit mehreren Jahren bekannt und seit 2009 im JSR 303 standardisiert. Um ein Attribut einer Java Klasse zu validieren, können die folgenden Annotationen aus dem javax.validation.constraints Package genutzt werden:

  • AssertFalse
  • AssertTrue
  • DecimalMax
  • DecimalMin
  • Digits
  • Future
  • Max
  • Min
  • NotNull
  • Null
  • Past
  • Pattern
  • Size

Folgendes Listing enthält eine beispielhafte Nutzung der Constraint Annotations:

Mit Hilfe der Klasse org.springframework.validation.beanvalidation.LocalValidatorFactoryBean kann eine Validierung einer Person Instanz wie folgt durchgeführt werden:

Die validate Methode der LocalValidatorFactoryBean gibt für jeden Validierungsfehler ein ConstraintViolation Objekt zurück, der in der Folge weiter verwendet werden kann.

Method Validation

Weniger bekannt ist, dass die Constraint-Annotations nicht auf Feld-Ebene beschränkt sind. Schaut man bspw. in den Quellcode für die @Min Annotation, so sieht man, dass als Target-Metainformation ebenfalls METHOD und PARAMETER angegeben sind:

Die Annotations können also auch auf Methodenebene verwendet werden, wie folgendes Listing zeigt:

Für die Methode countJuhu sind folgende Regeln definiert:

  • Parameter start darf maximal 10 sein
  • Return Wert muss minimal 9 sein

Wird also bspw. ein Wert grösser 10 beim Methodenaufruf mitgegeben, so wird eine ConstraintViolationException geworfen und die Methodenausführung abgebrochen. Ist der Return-Wert geringer als 9, wird nach erfolgter Methodenausführung eine ConstraintViolationException geworfen.
Folgendes Listing zeigt einen entsprechenden Test:

Der Test führt zu folgender Ausgabe auf der Konsole:

Während die Bean Validierung auch ohne weitere Nutzung von Spring eingesetzt werden kann, ist dies für die Methoden Validierung nicht möglich. Es können nur Methoden von Komponenten validiert werden, die auch vom Spring Container „gemanagt“ sind.


Quellen / Links:

Bean Validation Spezifikation 303: http://beanvalidation.org/1.0/spec/

 

Verfasst von Björn Seebeck am 13. Juni 2017