JsR 303 Bean validation

Werbung
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
Herunterladen