35
JSR 303 BEAN VALIDATION Simon Martinelli – [email protected]

JSR 303 BEAN VALIDATION Simon Martinelli – [email protected]

Embed Size (px)

Citation preview

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

JSR 303BEAN VALIDATION

Simon Martinelli – [email protected]

Page 2: JSR 303 BEAN 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

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

Was sind Bedingungen?3

JSR 303 Bean Validation - Simon Martinelli 2009

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

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

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

Bedingungen in Java

JSR 303 Bean Validation - Simon Martinelli 2009

5

Wo müssen diese angewendet werden?

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

Ziel

JSR 303 Bean Validation - Simon Martinelli 2009

6

Weniger Code Ein Framework Auf allen Schichten anwendbar

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

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”);}

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

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

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

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

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

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

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

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!

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

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");}...

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

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>

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

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;

...}

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

JSR 30315

JSR 303 Bean Validation - Simon Martinelli 2009

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

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

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

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

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

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

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

Beispiel

JSR 303 Bean Validation - Simon Martinelli 2009

19

public class Employee {

@NotNullprivate String name;

@Max(value = 500000)private long salary;

...

}

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

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; ...}

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

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) { ... }}

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

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 ...

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

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

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

(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

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

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})

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

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

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

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…

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

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

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

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

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

Demo30

JSR 303 Bean Validation - Simon Martinelli 2009

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

Ausblick31

JSR 303 Bean Validation - Simon Martinelli 2009

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

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

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

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)

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

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/

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

Fragen?35

JSR 303 Bean Validation - Simon Martinelli 2009