2. Gunnar Morling
• Contributor bei Hibernate Validator
• Blogger (http://www.gunnarmorling.de/)
• Softwarearchitekt/Entwicklungsleiter bei der Otto Group
07.04.2010 Bean Validation API 2/29
3. Validierung allerorten
• String:
– nicht null
– gültige E-Mail-Adresse oder URL
– gültige PLZ
• Zahl:
– zwischen 0 und 100
– gültige Kreditkartennummer
• GUI: Passwort_1 = Passwort_2
• Rechungsdatum nicht null (aber nur dann, wenn Auftrag im
Zustand “fakturiert”)
07.04.2010 Bean Validation API 3/29
4. Das Problem...
• Redundante Definition von Constraints
• Mögliche Inkonsistenzen
• Verschiedene Runtimes, verschiedene Validatoren
07.04.2010 Bean Validation API 4/29
5. ... und die Lösung
• Constraints an zentraler Stelle, eine Runtime
• Realisierungsmöglichkeiten: programmatisch vs. deklarativ
• Quelle für Constraints in angrenzende Systemen
(JavaScript, DDL)
07.04.2010 Bean Validation API 5/29
6. “Hello, Bean Validation!”
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 2, max = 14)
private String licensePlate;
@Min(value=2, message="Seat count must be 2 at least.")
private int seatCount;
public Car(String manufacturer, String licencePlate, int seatCount) {
//...
}
//...
}
• Constraints: Annotationen mit Standard- (u.a. “message”)
und spezifischen (z.B. “min”, “max”) Attributen
07.04.2010 Bean Validation API 6/29
7. JSR 303: “Bean Validation”
• JSR 303:
– Metamodell: Wie werden Constraints ausgedrückt?
– API: Wie werden Constraints ausgewertet?
• Spec Lead: Emmanuel Bernard (RedHat)
• In allen Anwendungsschichten nutzbar
• Teil von Java EE 6, aber auch unter SE nutzbar
• Implementierungen:
– Hibernate Validator (Referenzimplementierung, Teil von GF v3)
– Agimatec Validation
– Weitere geplant (z.B. OVal)
07.04.2010 Bean Validation API 7/29
9. Validierung von Objektgraphen
public class Person {
@NotNull
@Size(min=3, max=50)
private String name;
//...
}
public class Car {
private String manufacturer;
private String licensePlate;
private int seatCount;
@NotNull
private Person driver;
//...
}
07.04.2010 Bean Validation API 9/29
10. Validierung von Objektgraphen
public class Person {
@NotNull
@Size(min=3, max=50)
private String name;
//...
}
public class Car {
private String manufacturer;
private String licensePlate;
private int seatCount;
@NotNull
@Valid
private Person driver;
//...
}
07.04.2010 Bean Validation API 9/29
11. Feldübergreifende Validierung
• Validierung mitunter von mehreren Attributen einer Klasse
abhängig:
public class Car {
private String manufacturer;
private String licensePlate;
@Min(value=2)
private int seatCount;
@NotNull
@NotEmpty
private List<Person> passengers;
//...
}
07.04.2010 Bean Validation API 10/29
12. Feldübergreifende Validierung
• Mittels Class-Level-Constraints Zugriff auf alle Attribute
einer Klasse möglich:
@PassengerCount
public class Car {
private String manufacturer;
private String licensePlate;
@Min(value=2)
private int seatCount;
@NotNull
@NotEmpty
private List<Person> passengers;
//...
}
07.04.2010 Bean Validation API 10/29
16. Validierungsgruppen
• Erfordernis, nur Teilmengen der Constraints zu prüfen:
– Objektlebenszyklus
– Wizards
– Nutzerrolle
• Repräsentation in Form von Interfaces (Vererbungsbe-
ziehungen, typsicher):
•
public interface MyValidationGroup {}
• Zuordnung von Constraints zu Gruppen:
– Parameter “groups”
– Ohne Zuordnung: javax.validation.groups.Default
07.04.2010 Bean Validation API 14/29
19. @GroupSequence
• Festlegung von Ausführungsreihenfolgen:
– Prüfung sehr teuer (CPU, externe Services etc.)
– Prüfung von Constraints erfordert validen Basiszustand
@GroupSequence({Default.class, AfterProcessing.class})
public interface Complete {}
•
• Festlegung der Default-Gruppe:
@GroupSequence({Order.class, AfterProcessing.class})
public class Order {
// ...
}
07.04.2010 Bean Validation API 16/29
20. Eigene Constraints definieren
• Die Standard-Constraints können um eigene erweitert
werden, z.B.:
– Gültige Postleitzahl
– Quersumme einer Auftragsnummer mod 10 = 0
– Event.startDate < Event.endDate
• Was wird benötigt:
– Constraint-Annotation
– Validator(en)
– Fehlertext
➔ Demo 2
07.04.2010 Bean Validation API 17/29
21. Zusammengesetzte Constraints
• Drei Constraints für Validierung des Nummernschilds
• Andere Entitäten mit gleichem Attribut?
@NotNull
@Size(min = 2, max = 14)
@CheckCase(CaseMode.UPPER)
private String licensePlate;
07.04.2010 Bean Validation API 18/29
28. Integration mit anderen APIs
• JPA 2
– Validierung vor Insert, Update (& Delete)
– Kein Nachladen aus der DB
– Berücksichtigung von Constraints für DDL
• JSF 2
– Autom. Validierung aller gebundenen Properties
– Wichtig: javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL = true
• Java EE 6
– Injektion von ValidatorFactory und Validator:
@Resource
private ValidatorFactory validatorFactory;
@Resource
private Validator validator;
07.04.2010 Bean Validation API 24/29