Date post: | 05-Apr-2015 |
Category: |
Documents |
Upload: | leni-stimmell |
View: | 115 times |
Download: | 1 times |
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
3
Bedingungen in Java
Wo müssen diese angewendet werden?
4
Ziel
Weniger Code Ein Framework Auf allen Schichten anwendbar
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”);}
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
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
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
9
Deklaration in JavaDoc
public class Address {/*** cannot be null* and must be lower than 30 chars*/private String street1;
Problem: wird nicht gelesen!
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");}...
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>
12
Deklaration mit Annotations
public class Address {
@NotNull @Length(max=30, message="longer than {max} characters") private String street1;
private String street2;
...}
13
JSR 303
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
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
16
Annotations Deklaratation
Auf Ebene Bean, Feld oder Getter
Eigenschaften Message Groups Spezifische Parameter
Deklarationen werden vererbt Klasse Interface
17
Beispiel
public class Employee {
@NotNullprivate String name;
@Max(value = 500000)private long salary;
...}
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; ...}
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 {};}
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; } }}
21
Mögliche Bedingungen
Vordefinierte @Null / @NotNull @AssertTrue / @AssertFalse @Min / @Max / @Size / @Digits @Past / @Future @Patterns / @Pattern
Eigene, z.B. @Email @CreditCard @Zugnummer ...
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
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
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})
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
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…
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
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
29
Demo
30
Ausblick
31
Endziel
Gemeinsame Deklaration von Bedingungen Keine Duplizierung Nahe am Code, nahe am Model
Wiederverwendbar Über Layer Frameworks Andere JSRs
Deklarativ Erweiterbar
32
Was fehlt noch?
Erweiterung um Methoden Parameter zu validieren
public @NotNull String saveItem( @Valid @NotNull Item item, @Max(23) BigDecimal price)...
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/