Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

33
Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation

Transcript of Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

Page 1: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

Bean Validation JSR-303

Persistente Domänenmodelle mit JPA 2.0 und Bean Validation

Page 2: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

2

Was sind Bedingungen?

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 3: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

3

Bedingungen in Java

Wo müssen diese angewendet werden?

Page 4: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

4

Ziel

Weniger Code Ein Framework Auf allen Schichten anwendbar

Page 5: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

5

Wo sind diese deklariert?

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 6: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

6

Wo sind diese deklariert?

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

Page 7: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

7

Probleme

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 8: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

8

Die Lösung

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 9: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

9

Deklaration in JavaDoc

public class Address {/*** cannot be null* and must be lower than 30 chars*/private String street1;

Problem: wird nicht gelesen!

Page 10: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

10

Deklaration im Code

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 11: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

11

Deklaration in XML

<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 12: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

12

Deklaration mit Annotations

public class Address {

@NotNull @Length(max=30, message="longer than {max} characters") private String street1;

private String street2;

...}

Page 13: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

13

JSR 303

Page 14: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

14

JSR 303

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 15: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

15

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

Page 16: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

16

Annotations Deklaratation

Auf Ebene Bean, Feld oder Getter

Eigenschaften Message Groups Spezifische Parameter

Deklarationen werden vererbt Klasse Interface

Page 17: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

17

Beispiel

public class Employee {

@NotNullprivate String name;

@Max(value = 500000)private long salary;

...}

Page 18: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

18

Kaskadierung

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

Page 19: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

19

Eigene Bedingung definieren (1)

Eine Anotation

package jpa.validator;

import java.lang.annotation.*;import javax.validation.Constraint;import javax.validation.Payload;

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = SalaryValidator.class)public @interface Salary {

String message() default "Salary nicht erlaubt";

Class[] groups() default {};

Class<? extends Payload>[] payload() default {};}

Page 20: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

20

Eigende Bedingung definierien (2)

Eine Implementation

public class SalaryValidator implements ConstraintValidator<Salary, Employee> {

@Override public void initialize(Salary constraintAnnotation) { //no initialization needed }

@Override public boolean isValid(Employee emp, ConstraintValidatorContext context) { if (emp == null) { return true; }

if (!emp.getName().startsWith("Julius") && emp.getSalary() > 200000) { return false; } else {

return true; } }}

Page 21: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

21

Mögliche Bedingungen

Vordefinierte @Null / @NotNull @AssertTrue / @AssertFalse @Min / @Max / @Size / @Digits @Past / @Future @Patterns / @Pattern

Eigene, z.B. @Email @CreditCard @Zugnummer ...

Page 22: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

22

Objekt(graph) validieren

Bean validierenSet<ConstraintViolation<Car>> cvs = validator.validate(car);

ConstraintViolation enthält Der ungültige Wert Eine internationalisierte Meldung Das ungültige Bean Pfad zum Property welches den ungültigen

Wert enthält

Page 23: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

23

(Fehler)meldungen 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 24: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

24

Groups

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 25: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

25

Constraint Metatdata Request API

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 26: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

26

Wer verwendet JSR 303?

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 27: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

27

JPA 2.0 und JSR 303

@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 28: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

28

XML

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 29: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

29

Demo

Page 30: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

30

Ausblick

Page 31: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

31

Endziel

Gemeinsame Deklaration von Bedingungen Keine Duplizierung Nahe am Code, nahe am Model

Wiederverwendbar Über Layer Frameworks Andere JSRs

Deklarativ Erweiterbar

Page 32: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

32

Was fehlt noch?

Erweiterung um Methoden Parameter zu validieren

public @NotNull String saveItem( @Valid @NotNull Item item, @Max(23) BigDecimal price)...

Page 33: Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

33

Weiter Infos

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/