JsR 303 Bean validation
Download
Report
Transcript JsR 303 Bean validation
JSR 303
BEAN VALIDATION
Simon Martinelli – [email protected]
Agenda
2
Was sind Bedingungen?
Lösung
heute
Probleme heute
JSR 303
Bedingungen
deklarieren
Bedingungen prüfen
Bedingungen abfragen
Demo
Ausblick
JSR 303 Bean Validation - Simon Martinelli 2009
3
Was sind Bedingungen?
JSR 303 Bean Validation - Simon Martinelli 2009
Was sind Bedingungen?
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
JSR 303 Bean Validation - Simon Martinelli 2009
Bedingungen in Java
5
Wo müssen diese angewendet werden?
JSR 303 Bean Validation - Simon Martinelli 2009
Ziel
6
Weniger Code
Ein Framework
Auf allen Schichten anwendbar
JSR 303 Bean Validation - Simon Martinelli 2009
Wo sind diese deklariert?
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”);
}
JSR 303 Bean Validation - Simon Martinelli 2009
Wo sind diese deklariert?
8
Presentation level
if (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
JSR 303 Bean Validation - Simon Martinelli 2009
Probleme
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
JSR 303 Bean Validation - Simon Martinelli 2009
Die Lösung
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
JSR 303 Bean Validation - Simon Martinelli 2009
Deklaration in JavaDoc
11
public class Address {
/**
* cannot be null
* and must be lower than 30 chars
*/
private String street1;
Problem: wird nicht gelesen!
JSR 303 Bean Validation - Simon Martinelli 2009
Deklaration im Code
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");
}
...
JSR 303 Bean Validation - Simon Martinelli 2009
Deklaration in XML
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>
JSR 303 Bean Validation - Simon Martinelli 2009
Deklaration mit Annotations
14
public class Address {
@NotNull
@Length(max=30,
message="longer than {max} characters“)
private String street1;
private String street2;
...
}
JSR 303 Bean Validation - Simon Martinelli 2009
15
JSR 303
JSR 303 Bean Validation - Simon Martinelli 2009
JSR 303
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 Bean Validation - Simon Martinelli 2009
JSR 303 Mitglieder
17
Apache Commons
Validator
Hibernate Validator
JavaServer Faces (JSF)
Oracle® ADF
RIFE
Spring Bean
Validation
Stripes
XWork Validation
Google
Oracle
Red Hat
Sun
andere
JSR 303 Bean Validation - Simon Martinelli 2009
Annotations
18
Deklaratation
Auf
Ebene Bean, Feld oder Getter
Eigenschaften
Message
Groups
Spezifische
Parameter
Deklarationen werden vererbt
Klasse
Interface
JSR 303 Bean Validation - Simon Martinelli 2009
Beispiel
19
public class Employee {
@NotNull
private String name;
@Max(value = 500000)
private long salary;
...
}
JSR 303 Bean Validation - Simon Martinelli 2009
Kaskadierung
20
@Valid
public 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;
...
}
JSR 303 Bean Validation - Simon Martinelli 2009
Eigene Bedingung definieren
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 Implementation
public class LengthConstraint implements Constraint<Length> {
public void initialize(Length annotation) { ... }
public boolean isValid(Object value) { ... }
}
JSR 303 Bean Validation - Simon Martinelli 2009
Mögliche Bedingungen
22
Vordefinierte
@Null / @NotNull
@AssertTrue / @AssertFalse
@Min / @Max / @Size / @Digits
@Past / @Future
@Patterns / @Pattern
Eigene, z.B.
@Email
@CreditCard
@Zugnummer
...
JSR 303 Bean Validation - Simon Martinelli 2009
Objekt(graph) validieren
23
Bean validieren
Set<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
JSR 303 Bean Validation - Simon Martinelli 2009
(Fehler)meldungen
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
JSR 303 Bean Validation - Simon Martinelli 2009
Groups
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})
JSR 303 Bean Validation - Simon Martinelli 2009
Constraint Metatdata Request API
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
JSR 303 Bean Validation - Simon Martinelli 2009
Wer verwendet JSR 303?
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…
JSR 303 Bean Validation - Simon Martinelli 2009
JPA 2.0 und JSR 303
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
JSR 303 Bean Validation - Simon Martinelli 2009
XML
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
JSR 303 Bean Validation - Simon Martinelli 2009
30
Demo
JSR 303 Bean Validation - Simon Martinelli 2009
31
Ausblick
JSR 303 Bean Validation - Simon Martinelli 2009
Endziel
32
Gemeinsame Deklaration von Bedingungen
Keine
Duplizierung
Nahe am Code, nahe am Model
Wiederverwendbar
Über
Layer
Frameworks
Andere JSRs
Deklarativ
Erweiterbar
JSR 303 Bean Validation - Simon Martinelli 2009
Was fehlt noch?
33
Erweiterung um Methoden Parameter zu validieren
public @NotNull String saveItem
(@Valid @NotNull Item item,
@Max(23) BigDecimal price)
…
JSR 303 Bean Validation - Simon Martinelli 2009
Weiter Infos
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/
JSR 303 Bean Validation - Simon Martinelli 2009
35
Fragen?
JSR 303 Bean Validation - Simon Martinelli 2009