JSR 303 BEAN VALIDATION Simon Martinelli – simon@martinelli.ch

Preview:

Citation preview

JSR 303BEAN VALIDATION

Simon Martinelli – simon@martinelli.ch

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

Recommended