Die zum Java-EE-6-Umfang gehörende Spezifikation Bean Validation (JSR 303) stellt einen wesentlichen Schritt zur einheitlichen Validierung von Geschäftsdaten dar. Wie von einer ersten Version zu erwarten, gibt es allerdings noch Bereiche mit Verbesserungspotenzial.
Mit BV ist es leicht möglich, z. B. ein Feld, das eine Telefonnummer enthalten soll, mit einem entsprechenden Constraint zu belegen:
@ValidTelNumber
private String telefonNummer;
Dabei sei angenommen, dass ValidTelNumber
eine passend definierte Annotation ist, bspw. auf Basis des Standard-Constraints Pattern
mit Hilfe von Constraint Composition. Das Vorgehen dazu ist im entsprechenden Kapitel der Spezifikation recht gut beschrieben.
Was aber, wenn statt der einzelnen Telefonnummer eine Collection von Telefonnummern validiert werden soll? Dazu gibt es leider keine direkte Unterstützung durch den Standard. Für eine solche ‘transitive’ Validierung ist prinzipiell das Constraint Valid
vorgesehen, was aber voraussetzt, dass entsprechende Validierungsregeln für den Elementtyp der Collection definiert sind. Im Beispielszenario ist dieser Typ aber String
, hat also keine Gültigkeitsregeln – erst recht nicht für den speziellen Anwendungsfall ‘Telefonnummer’.
Derzeit bleibt nur die Möglichkeit, eine individuelle Validierungsmethode in Kombination mit dem Standard-Constraint AssertTrue
einzusetzen:
private List telefonNummern = ...; @AssertTrue(message = "{...}") protected boolean isTelefonNummernValid() { if (this.telefonNummern != null) for (String telNo : this.telefonNummern.getValues()) if (!TelNumberValidator.isValid(telNo)) return false; return true; }
Hier wäre eine Erweiterung der Spezifikation wünschenswert, z. B. mit Hilfe einer Parametrisierung von Valid
:
@Valid(constraints={@ValidTelNumber}
private List telefonNummern = …;