Upload
kriemhilde-weyhrich
View
128
Download
4
Embed Size (px)
Citation preview
JSR 303BEAN VALIDATION
Simon Martinelli – [email protected]
Agenda
JSR 303 Bean Validation - Simon Martinelli 2009
2
Was sind Bedingungen? Lösung heute Probleme heute
JSR 303 Bedingungen deklarieren Bedingungen prüfen Bedingungen abfragen
Demo Ausblick
Was sind Bedingungen?3
JSR 303 Bean Validation - Simon Martinelli 2009
Was sind Bedingungen?
JSR 303 Bean Validation - Simon Martinelli 2009
4
Anforderungen Restriktionen an Bean, Feld oder Property z.B. Not Null, 0 - 10, gültige E-Mail-Adresse etc.
Nutzen User über Fehler informieren Sicherstellen, dass eine Komponente richtig
funktioniert Ungültige Daten in der Datenbank verhindern
Bedingungen in Java
JSR 303 Bean Validation - Simon Martinelli 2009
5
Wo müssen diese angewendet werden?
Ziel
JSR 303 Bean Validation - Simon Martinelli 2009
6
Weniger Code Ein Framework Auf allen Schichten anwendbar
Wo sind diese deklariert?
JSR 303 Bean Validation - Simon Martinelli 2009
7
Database Schema
create table Document ( id bigint not null primary key, title varchar(30) not null, summary varchar(255), content varchar(255))
Business Code
if (document.getTitle() == null || document.getTitle().length() > 30) { throw new BusinessException( “Document title invalid”);}
Wo sind diese deklariert?
JSR 303 Bean Validation - Simon Martinelli 2009
8
Presentation levelif (documentForm.getTitle() == null || documentForm.getTitle().length() > 30) { throw new BusinessException(“Document title invalid”);}
Oder in XML des Web Frameworks Client side
JavaScript JSF Struts Spring MVC
Probleme
JSR 303 Bean Validation - Simon Martinelli 2009
9
Duplizierung Mehrfache Deklaration der selben Bedingung Doppelter Code Risiko der Inkonsistenz
Überprüfung zur Laufzeit Nicht alle Bedingungen können überall
geprüft werden Unterschiedliche Semantik
Die Lösung
JSR 303 Bean Validation - Simon Martinelli 2009
10
Einheitliche Form Eine Sprache für alle Basierend auf dem Domain Modell
(JavaBeans) Einheitliche Validierung
Ein Framework Eine Implementierung
Brücke zu anderen Technologien API um auf Bedingungen zuzugreifen
Deklaration in JavaDoc
JSR 303 Bean Validation - Simon Martinelli 2009
11
public class Address {/*** cannot be null* and must be lower than 30 chars*/private String street1;
Problem: wird nicht gelesen!
Deklaration im Code
JSR 303 Bean Validation - Simon Martinelli 2009
12
public class Address {private String street1;private String street2;...
public void invariant() { if (street1 == null) throw new IllegalStateException( "street1 cannot be null");
if (street1.length() > 30) throw new IllegalStateException( "street1 must not be longer than 30 characters");}...
Deklaration in XML
JSR 303 Bean Validation - Simon Martinelli 2009
13
<constraints><bean name="com.jboss.example.jsr303.Address"> <field name="street1"> <constraint class="org.jboss.constraints.NotNull"/> <constraint class="org.jboss.constraints.Length„> <param name="max">30</param> <param name="message"> street1 longer than 30 characters </param> </constraint> </field>...</bean>
</constraints>
Deklaration mit Annotations
JSR 303 Bean Validation - Simon Martinelli 2009
14
public class Address {
@NotNull @Length(max=30, message="longer than {max} characters“) private String street1;
private String street2;
...}
JSR 30315
JSR 303 Bean Validation - Simon Martinelli 2009
JSR 303
JSR 303 Bean Validation - Simon Martinelli 2009
16
Standardisierte Deklaration Annotations (und XML) Eigene Bedingungen
Standartisiertes Validation API Layer unabhängig I18n Extension points
Standardisierte Metadaten API Integrationspunkt für andere JSRs und
Frameworks Kann auch ausserhalb von Java verwendet
werden
JSR 303 Mitglieder
Apache Commons Validator
Hibernate Validator JavaServer Faces
(JSF) Oracle® ADF RIFE Spring Bean
Validation
Stripes XWork Validation Google Oracle Red Hat Sun andere
17
JSR 303 Bean Validation - Simon Martinelli 2009
Annotations
JSR 303 Bean Validation - Simon Martinelli 2009
18
Deklaratation Auf Ebene Bean, Feld oder Getter
Eigenschaften Message Groups Spezifische Parameter
Deklarationen werden vererbt Klasse Interface
Beispiel
JSR 303 Bean Validation - Simon Martinelli 2009
19
public class Employee {
@NotNullprivate String name;
@Max(value = 500000)private long salary;
...
}
Kaskadierung
JSR 303 Bean Validation - Simon Martinelli 2009
20
@Validpublic class Address { @NotNull @Length(max=30, message="longer than {max} characters“) private String street1; ... @NotNull @Valid private Country country;}
public class Country { @NotNull @Length(max=30) private String name; ...}
Eigene Bedingung definieren
JSR 303 Bean Validation - Simon Martinelli 2009
21
Eine Annotation@ConstraintValidator(LengthConstraint.class)public @interface Length { String message() default "{beanckeck.length}"; String[] groups() default {}; int min() default 0; int max() default Integer.MAX_VALUE;}
Eine Implementationpublic class LengthConstraint implements Constraint<Length> { public void initialize(Length annotation) { ... } public boolean isValid(Object value) { ... }}
Mögliche Bedingungen
JSR 303 Bean Validation - Simon Martinelli 2009
22
Vordefinierte @Null / @NotNull @AssertTrue / @AssertFalse @Min / @Max / @Size / @Digits @Past / @Future @Patterns / @Pattern
Eigene, z.B. @Email @CreditCard @Zugnummer ...
Objekt(graph) validieren
JSR 303 Bean Validation - Simon Martinelli 2009
23
Bean validierenSet<InvalidConstraint> errors = addressValidator.validate(address);
InvalidConstraint enthält Der ungültige Wert Eine internationalisierte Meldung Das ungültige Bean Pfad zum Property welches den ungültigen
Wert enthält
(Fehler)meldungen
JSR 303 Bean Validation - Simon Martinelli 2009
24
Können ausgelagert werden I18n Parameter können in Meldung integriert
werden Wert muss kleiner sein als {min}
Eigener MessageResolver Kann in Frameworks verwendet werden Kann kontextsensitive Daten ausgeben
Groups
JSR 303 Bean Validation - Simon Martinelli 2009
25
Interface Subset von Bedingungen Erlaubt partielle Validierung
z.B. nur Bedingungen eines spezifischen UseCases Reihenfolge der Validierung kann bestimmt
werden Abhängikeiten zu anderen Bedingungen Resourcen- oder zeitintensive Validierungen zu
letzt
@GroupSequence(name = Default.class, sequence = {First.class, Second.class, Last.class})
Constraint Metatdata Request API
JSR 303 Bean Validation - Simon Martinelli 2009
26
Bietet Zugriff die Metadaten Z.B. Liste aller Bedingungen einer
Nützlich für Schnittstellen zu anderen Technologien Persistence (DDL) Presentation layer (Javascript™
programming language) Tools
Wer verwendet JSR 303?
JSR 303 Bean Validation - Simon Martinelli 2009
27
Java Persistence API 2.0 Schema Generierung Neue Entity Validierung
Web Beans (JBoss Seam) Presentation (deklarativ) Business (deklarativ)
JSF 2.0 und AJAX Libraries RichFaces
Ihr eigener Code! Und viele mehr…
JPA 2.0 und JSR 303
JSR 303 Bean Validation - Simon Martinelli 2009
28
@NotNull statt @Column(nullable=false) @Size.max statt @Column.length @Digits statt @Column.precision/.scale @Min / @Max bei numerischen Columns @Future / @Past bei Datumstypen @Size für Collections und Arrays
XML
JSR 303 Bean Validation - Simon Martinelli 2009
29
META-INF/validation.xml Inhalt
Definition der Bedingungen Deklaration der Bedingungen
XML ergänzt UND überschreibt Annotations!
Vorteil Keine Neukompilation bei Änderung der
Bedingungen Trennung Code und Bedingungen
Demo30
JSR 303 Bean Validation - Simon Martinelli 2009
Ausblick31
JSR 303 Bean Validation - Simon Martinelli 2009
Endziel
JSR 303 Bean Validation - Simon Martinelli 2009
32
Gemeinsame Deklaration von Bedingungen Keine Duplizierung Nahe am Code, nahe am Model
Wiederverwendbar Über Layer Frameworks Andere JSRs
Deklarativ Erweiterbar
Was fehlt noch?
JSR 303 Bean Validation - Simon Martinelli 2009
33
Erweiterung um Methoden Parameter zu validieren
public @NotNull String saveItem (@Valid @NotNull Item item, @Max(23) BigDecimal price)
…
Weiter Infos
JSR 303 Bean Validation - Simon Martinelli 2009
34
JSR 303 http://jcp.org/en/jsr/detail?id=303 http://forum.hibernate.org/viewforum.php?
f=26
Referenz Implementation Hibernate Validator http://validator.hibernate.org/
Fragen?35
JSR 303 Bean Validation - Simon Martinelli 2009