Ein Standard für metadatenbasierte Validierung in allen Layern einer Applikation. Mit diesem Versprechen geht der neue Bean-Validation Standard, auch bekannt als JSR 303, ins Rennen. Von der Wiederverwendbarkeit von bestehenden Constraints zum einfacheren Aufbau eigener Constraints bis hin zur Validierung von Objektgraphen bietet diese Spezifikation einige Mechanismen für metadatenbasierte Validierungen. In einer Feature Tour werden die zentralen Bestandteile der Spezifikation vorgestellt.
In einem zweiten Teil wird die Nutzung von metadatenbasierter Validierung in JEE-Webapplikationen gezeigt. Anhand von kurzen Beispielen wird die Rolle von MyFaces Extensions Validator (aka MyFaces ExtVal) bei der Integration von JSR 303 in JSF-Applikationen veranschaulicht.
3. DI (FH) Gerhard.Petracek @irian.at
• JCP-Member
(Bean Validation Expert Group)
• Apache MyFaces
• Committer
• PMC Member
• Project Lead (ExtVal)
• Schulungen zu JEE (v.a. JSF)
• Autor verschiedener Fachartikel
• Vorträge (Software und Web-Engineering)
17.12.2009
4. Bean-Validation Ökosystem - 1
• Spec.-Lead: Emmanuel Bernard
• EG-Members
• Internationale Firmen wie
• Sun
• Oracle
• Google
• uvm.
• Einige Project Leads erfolgreicher
Validierungsframeworks
• Von Irian Solutions: Gerhard Petracek
17.12.2009
5. Bean-Validation Ökosystem - 2
• Implementierungen
• Hibernate-Validator v4+ (RI)
• Agimatec-validation (bald bei Apache SF)
• OVal
• JSF Support lt. Spec. für JSF 2+
• Adapter für JSF
• MyFaces ExtVal BV-Integration-Module
(für JSF 1.x und JSF 2+)
17.12.2009
6. Hello Bean-Validation
• Beispiel
public class Customer {
@NotNull
private String firstName;
public String getFirstName() {
return firstName;
}
public void setFirstName(
String firstName) {
this.firstName = firstName;
}
}
17.12.2009
9. Eigene Constraints Definieren
• Erforderliche Bestandteile:
• @Constraint (1-n Constraint-Validator(en))
• Target
• FIELD
• METHOD
• TYPE
• ANNOTATION_TYPE (für Constraint composition)
• Und natürlich: Retention RUNTIME
• Verpflichtende Attribute
• message
• groups
• payload
17.12.2009
10. Constraint-Validatoren
• Implementierung von
javax.validation.ConstraintValidator
• initialize
• isValid
• Ist auf ein Constraint und einen
Ziel-Typ beschränkt (via Generics)
• Ein Constraint kann für mehrere
Ziel-Typen verwendet werden
• Bsp.: @Size für String, Array, Map, …
17.12.2009
11. Error Messages
• Message-Interpolator transformiert
Nachrichten automatisch
• Keys
• Hardcoded
• Beispiel:
@Size(min = 1, max = 10,
message = "{firstName.lengthMessage}")
Resource-Bundle:
firstName.lengthMessage =
Name must be between {min} and {max}
17.12.2009
12. Group-Validation / Partial-Validation
• Default:
Constraint ist der Default-Gruppe zugeordnet
(javax.validation.groups.Default)
• Gruppen sind Interfaces und somit typesafe
• Ermöglicht Validierung impliziter Gruppen
• Beispiel:
@NotNull
entspricht
@NotNull(groups = Default.class)
17.12.2009
13. Reihenfolge bei der Validierung
• Default: keine Reihenfolge
• @GroupSequence ermöglicht die Angabe
der Reihenfolge
• Rechenintensive Gruppen sollen am Ende
validiert werden
• Validierung einer Gruppe findet statt, wenn
die vorherige Gruppe fehlerfrei validiert
wurde
17.12.2009
14. Multiple-Constraints
• Via Annotation-Element
(Array vom Constraint-Typ)
• Beispiel:
Zuordnung von Constraints zu Rollen
(via Group-Validation)
@Size.List({
@Size(groups = Default.class
min = 10, max = 20),
@Size(groups = AdminGroup.class
min = 1, max = 30)
})
17.12.2009
15. Validation-Payload
• Subset von Validation-Parameter
(siehe MyFaces ExtVal >= 3. Release)
• javax.validation.Payload
• Für Validation-Clients wie MyFaces ExtVal
nutzbar – bspw.: Severity.Warn.class
• Beispiel:
public class Severity {
public static class Warn
implements Payload {}
public static interface Error
extends Payload {}
}
17.12.2009
16. Graph-Validation
• Wird ein Objekt validiert, dann werden
referenzierte Objekte mit-validiert, wenn
@Valid verwendet wird
• Auch Inhalte von Collections und Arrays
• Keine Validierung erfolgt, wenn Lazy-
Properties noch nicht geladen wurden
17.12.2009
17. Class-Level Validation
• Constraint für e. Klasse/Interface
• Wird vererbt aber nicht überschrieben
• Bei der Validierung liegt das aktuelle
Objekt im gesamten vor
• In JSF nur mit MyFaces ExtVal
17.12.2009
18. Constraint-Composition
• Mit Constraints annotierte Constraints
• Wiederverwendung von Constraints
• Violation-Message(s)
• Default: Messages der einzelnen Constraints
• Mit @ReportAsSingleViolation wird die
Error-Message des Haupt-Constraints
angezeigt
17.12.2009
21. Bean-Validation und JSF
• Änderungen in JSF 2.0 für JSR 303
• Default Validator
• Geändertes Verhalten v. required-Attribut
• ValidatorException mit mehreren Messages
• Verschiedene Konfigurationsparameter
• Spezieller Tag (validiert Default-Gruppe):
<f:validateBean/>
• Beispiele:
• Validierung der Default Group
• Group-Validation
<f:validateBean validationGroups =
"at.irian.demo.validation.groups.Order"/>
17.12.2009
22. MyFaces Extensions Validator
Ermöglicht die einfache Umsetzung von
fortschrittlichen Validierungskonzepten für
JSF-Applikationen auf Basis von
dynamischen
Metadaten.
17.12.2009
24. Bean-Validation & MyFaces ExtVal - 1
• MyFaces ExtVal bietet JSR 303
Integration für alle JSF Versionen
• Integration als unabhängiges
Validation-Module
• Group-Validation erfolgt via Annotation
• Definition (norm.) auf Page-Bean-Level
• Compile-time check + IDE Support
• Support für Model-Validation
• Sorted violation messages
• DI Support für Constraint-Validatoren
17.12.2009
25. Bean-Validation & MyFaces ExtVal - 2
• Severity Aware Validation
• Client-side validation in Kombination mit
MyFaces Trinidad
• Group Storage
(ermöglicht die Speicherung von Validation-
Groups in unterschiedlichen Quellen)
• Validation Interception
• Validation Exception Intercepetion
• Einige Add-ons
17.12.2009
27. JSF-Request-Lifecycle - Validierung
Faces- Apply Conversion
Restore Process
request Request and
View Events
Values Validation
Process
events
CLIENT
Update
Model
Faces-
response Render Process Invoke Process
Response Events Application Events
Validation / Conversion Errors
Render Response
17.12.2009
28. Exkurs: ExtVal im JSF-Lifecycle
Apply Conversion
Restore Update Invoke Render
Request and
Application
View Model Response
Values Validation
ExtVal
ExtVal Std. JSF
Cross-
Validation Validation
Validation
17.12.2009
29. ExtVal-BV-Integration im JSF-Lifecycle
Apply Conversion
Restore Update Invoke Render
Request and
Application
View Model Response
Values Validation
ExtVal-BV
ExtVal-BV Std. JSF
Model
Validation Validation
Validation
17.12.2009
30. Group-Validation mit MyFaces ExtVal
• Via @BeanValidation
(= typsichere Alternative zu f:validateBean)
• Nur bei Group-Validation (und Model Validation)
• Möglichkeiten
• Simple Angabe von Gruppen
• Einschränkung auf View-IDs
• Bedingungen via EL-Expression definieren
• Gruppen herausfiltern
17.12.2009
31. @BeanValidation Beispiele
• Group-Validation für alle Seiten, die dieses
Page-Bean verwenden
public class HelloWorldController {
@BeanValidation(useGroups = User.class)
private Person person = new Person();
…
}
• Group-Validation nach Seiten unterscheiden
@BeanValidation.List({
@BeanValidation(viewIds = "/page1.xhtml",
useGroups = User.class),
@BeanValidation(viewIds = "/page2.xhtml",
useGroups = Admin.class)
})
public class HelloWorldController {
private Person person = new Person();
…
}
17.12.2009
32. @ModelValidation
• Diese Validierung erfolgt nach der Phase
„Update Model Values“
• Validiert wird
• Base-Objekt der Property (Default)
• Andere Objekte (via EL-Expression)
• Rollback via Add-on möglich
• Beispiel:
@BeanValidation(modelValidation =
@ModelValidation(isActive = true))
17.12.2009
33. @ModelValidation – Fehlermeldungen
• Fehler-Meldungen werden global angezeigt
(inline ist optional möglich)
• Fehlermeldungen können bei Bedarf
überschrieben werden
17.12.2009
34. ExtVal-Add-ons für JSR 303 Validation
• Group-Validation via action-Methoden
• Transactional model validation
• Continue with warnings
• Bypass BV
• Tag als Alternative zu @BeanValidation
• ...
17.12.2009