SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Objektvalidierung mit dem
Bean Validation API




                  JUG Hamburg – 07.04.2010

                            Gunnar Morling
Gunnar Morling

 • Contributor bei Hibernate Validator
 • Blogger (http://www.gunnarmorling.de/)
 • Softwarearchitekt/Entwicklungsleiter bei der Otto Group




07.04.2010               Bean Validation API                 2/29
Validierung allerorten

 • String:
      – nicht null
      – gültige E-Mail-Adresse oder URL
      – gültige PLZ
 • Zahl:
      – zwischen 0 und 100
      – gültige Kreditkartennummer
 • GUI: Passwort_1 = Passwort_2
 • Rechungsdatum nicht null (aber nur dann, wenn Auftrag im
   Zustand “fakturiert”)




07.04.2010                  Bean Validation API          3/29
Das Problem...




 • Redundante Definition von Constraints
 • Mögliche Inkonsistenzen
 • Verschiedene Runtimes, verschiedene Validatoren


07.04.2010              Bean Validation API              4/29
... und die Lösung




 • Constraints an zentraler Stelle, eine Runtime
 • Realisierungsmöglichkeiten: programmatisch vs. deklarativ
 • Quelle für Constraints in angrenzende Systemen
   (JavaScript, DDL)
07.04.2010               Bean Validation API               5/29
“Hello, Bean Validation!”
 public class Car {

     @NotNull
     private String manufacturer;

     @NotNull
     @Size(min = 2, max = 14)
     private String licensePlate;

     @Min(value=2, message="Seat count must be 2 at least.")
     private int seatCount;
     
     public Car(String manufacturer, String licencePlate, int seatCount) {
         //...
     }
     //...
 }


 • Constraints: Annotationen mit Standard- (u.a. “message”)
   und spezifischen (z.B. “min”, “max”) Attributen


07.04.2010                    Bean Validation API                            6/29
JSR 303: “Bean Validation”

 • JSR 303:
      – Metamodell: Wie werden Constraints ausgedrückt?
      – API: Wie werden Constraints ausgewertet?
 • Spec Lead: Emmanuel Bernard (RedHat)
 • In allen Anwendungsschichten nutzbar
 • Teil von Java EE 6, aber auch unter SE nutzbar
 • Implementierungen:
      – Hibernate Validator (Referenzimplementierung, Teil von GF v3)
      – Agimatec Validation
      – Weitere geplant (z.B. OVal)




07.04.2010                  Bean Validation API                    7/29
Demo 1: Constraints definieren

 • Demo 1:
      – Felder
      – Properties
      – Vererbung




07.04.2010                Bean Validation API   8/29
Validierung von Objektgraphen
 public class Person {

     @NotNull
     @Size(min=3, max=50)
     private String name;

     //...
 }

 public class Car {

     private String manufacturer;
     private String licensePlate;
     private int seatCount;
     
     @NotNull
     private Person driver;

     //...
 }




07.04.2010                    Bean Validation API   9/29
Validierung von Objektgraphen
 public class Person {

     @NotNull
     @Size(min=3, max=50)
     private String name;

     //...
 }

 public class Car {

     private String manufacturer;
     private String licensePlate;
     private int seatCount;
     
     @NotNull
     @Valid
     private Person driver;

     //...
 }



07.04.2010                    Bean Validation API   9/29
Feldübergreifende Validierung

 • Validierung mitunter von mehreren Attributen einer Klasse
   abhängig:
 public class Car {

     private String manufacturer;
     private String licensePlate;

     @Min(value=2)
     private int seatCount;
     
     @NotNull
     @NotEmpty
     private List<Person> passengers;

     //...
 }




07.04.2010                    Bean Validation API         10/29
Feldübergreifende Validierung

 • Mittels Class-Level-Constraints Zugriff auf alle Attribute
   einer Klasse möglich:
 @PassengerCount
 public class Car {

     private String manufacturer;
     private String licensePlate;

     @Min(value=2)
     private int seatCount;
     
     @NotNull
     @NotEmpty
     private List<Person> passengers;

     //...
 }




07.04.2010                    Bean Validation API               10/29
Vordefinierte Constraints

 • Bestandteil von JSR 303
      –   @Null, @NotNull
      –   @AssertFalse, @AssertTrue
      –   @Past, @Future
      –   @Min, @Max, @Digits, @DecimalMin, @DecimalMax
      –   @Size, @Pattern
      –   @Valid
 • Zusätzlich in Hibernate Validator 4.0
      –   @Email
      –   @Length
      –   @NotEmpty
      –   @Range




07.04.2010                  Bean Validation API           11/29
Constraints auswerten

 • javax.validation.Validator:

 Car car = new Car(null, "DD­AB­123", 4);
     
 Validator validator = 
     Validation.buildDefaultValidatorFactory().getValidator();

 //Objekt validieren
 Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car);
     
 //Property validieren
 constraintViolations = validator.validateProperty(car, "licensePlate");
     
 //Wert validieren
 constraintViolations = 
     validator.validateValue(Car.class, "licensePlate", "DD­AB­123");




07.04.2010                     Bean Validation API                       12/29
javax.validation.ConstraintViolation
Car car = new Car("Morris", "DD­AB­123", 1);

Validator validator = 
Validation.buildDefaultValidatorFactory().getValidator();

Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car);
assertEquals(1, constraintViolations.size());

ConstraintViolation<Car> violation = constraintViolations.iterator().next();

assertEquals(car, violation.getRootBean());
assertEquals("seatCount", 
    violation.getPropertyPath().iterator().next().getName());

assertEquals(1, violation.getInvalidValue());
assertEquals("Seat count must be 2 at least.", violation.getMessage());

assertEquals(Min.class,
    violation.getConstraintDescriptor().getAnnotation().annotationType());




07.04.2010                    Bean Validation API                         13/29
Validierungsgruppen

 • Erfordernis, nur Teilmengen der Constraints zu prüfen:
      – Objektlebenszyklus
      – Wizards
      – Nutzerrolle
 • Repräsentation in Form von Interfaces (Vererbungsbe-
   ziehungen, typsicher):
 •
    public interface MyValidationGroup {}

 • Zuordnung von Constraints zu Gruppen:
      – Parameter “groups”
      – Ohne Zuordnung: javax.validation.groups.Default




07.04.2010                    Bean Validation API           14/29
Validierungsgruppen – Beispiel
public class Order {

    @NotNull @Size(min = 10, max = 10)
    @Pattern(regexp = "ON[0­9]*")
    private String orderNumber;

    @Valid @NotNull @Size(min = 1, max = 50)
    private List<OrderLine> orderLines;

    @NotNull @Past
    private Date orderDate;

    @NotNull @Past
    private Date invoiceDate;

    // ...
}




07.04.2010                      Bean Validation API   15/29
Validierungsgruppen – Beispiel
public class Order {

    public interface AfterProcessing {}

    @NotNull @Size(min = 10, max = 10) @Pattern(regexp = "ON[0­9]*")
    private String orderNumber;

    @Valid @NotNull @Size(min = 1, max = 50)
    private List<OrderLine> orderLines;

    @NotNull @Past
    private Date orderDate;

    @NotNull(groups=AfterProcessing.class) @Past(groups=AfterProcessing.class)
    private Date invoiceDate;
    
    // ...
}

Validator validator = ...;
Order order = ...;
validator.validate(order, AfterProcessing.class);



07.04.2010                     Bean Validation API                       15/29
@GroupSequence

 • Festlegung von Ausführungsreihenfolgen:
      – Prüfung sehr teuer (CPU, externe Services etc.)
      – Prüfung von Constraints erfordert validen Basiszustand
 @GroupSequence({Default.class, AfterProcessing.class})
 public interface Complete {}
 •
 • Festlegung der Default-Gruppe:
 @GroupSequence({Order.class, AfterProcessing.class})
 public class Order {

     // ...
 }




07.04.2010                    Bean Validation API                16/29
Eigene Constraints definieren

 • Die Standard-Constraints können um eigene erweitert
   werden, z.B.:
      – Gültige Postleitzahl
      – Quersumme einer Auftragsnummer mod 10 = 0
      – Event.startDate < Event.endDate
 • Was wird benötigt:
      – Constraint-Annotation
      – Validator(en)
      – Fehlertext
      ➔ Demo 2




07.04.2010                  Bean Validation API          17/29
Zusammengesetzte Constraints

 • Drei Constraints für Validierung des Nummernschilds
 • Andere Entitäten mit gleichem Attribut?
 @NotNull
 @Size(min = 2, max = 14)
 @CheckCase(CaseMode.UPPER)
 private String licensePlate;




07.04.2010                      Bean Validation API      18/29
Zusammengesetzte Constraints
 @NotNull
 @Size(min = 2, max = 14)
 @CheckCase(CaseMode.UPPER)
 private String licensePlate;

 @NotNull
 @Size(min = 2, max = 14)
 @CheckCase(CaseMode.UPPER)
 @Constraint(validatedBy={})
 @Target({ElementType.FIELD, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ValidLicensePlate {

     String message() default "{de.jughh.bv.ValidLicensePlate.message}";

     Class<?>[] groups() default {};

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

 }




07.04.2010                      Bean Validation API                        19/29
Zusammengesetzte Constraints
 @NotNull
 @Size(min = 2, max = 14)
 @CheckCase(CaseMode.UPPER)
 private String licensePlate;

 @NotNull
 @Size(min = 2, max = 14)
 @CheckCase(CaseMode.UPPER)
 @Constraint(validatedBy={})
 @Target({ElementType.FIELD, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ValidLicensePlate {

     String message() default "{de.jughh.bv.ValidLicensePlate.message}";

     Class<?>[] groups() default {};

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

 }

 @ValidLicensePlate
 private String licensePlate;


07.04.2010                      Bean Validation API                        19/29
Zusammengesetzte Constraints

 • Rückgabe einer einzigen Constraint-Verletzung per
   @ReportAsSingleViolation:

 @NotNull
 @Size(min = 2, max = 14)
 @CheckCase(CaseMode.UPPER)
 @ReportAsSingleViolation
 @Constraint(validatedBy={})
 @Target({ElementType.FIELD, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ValidLicensePlate {

     String message() default "{de.jughh.bv.ValidLicensePlate.message}";

     Class<?>[] groups() default {};

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

 }




07.04.2010                    Bean Validation API                          20/29
XML-Konfiguration: validation.xml
<?xml version="1.0" encoding="UTF­8"?>
<validation­config
  xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema­instance"
  xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration 
                                          validation­configuration­1.0.xsd">
    
    <constraint­validator­factory>
      de.jughh.bv.MyConstraintValidatorFactory
    </constraint­validator­factory>
    <message­interpolator>
      de.jughh.bv.MyMessageInterpolator
    </message­interpolator>

    <constraint­mapping>
      META­INF/validation/car­constraints.xml
    </constraint­mapping>
    <constraint­mapping>...</constraint­mapping>

    <property name="de.jughh.bv.validation.logging">WARN</property>

</validation­config>


07.04.2010                    Bean Validation API                       21/29
XML-Konfiguration: Constraint-Mappings
 <?xml version="1.0" encoding="UTF­8"?>
 <constraint­mappings 
   xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema­instance"
   xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping 
                                                validation­mapping­1.0.xsd">

   <default­package>de.jughh.bv.domain</default­package>

   <bean class="Car" ignore­annotations="false">
     <field name="licensePlate">
       <constraint annotation="javax.validation.constraint.Size">
         <message>Size of license plate is limited</message>
         <groups>
           <value>de.jughh.bv.LightValidation</value>
         </groups>
         <element name="max">10</element>
       </constraint>
     </field>
   </bean>

 </constraint­mappings>


07.04.2010                    Bean Validation API                        22/29
Bootstrapping
 //1. Default­Factory
 Validator validator = 
     Validation.buildDefaultValidatorFactory().getValidator();

 //2. Angepasste Factory
 Configuration<?> configuration = Validation.byDefaultProvider().configure();
     
 ValidatorFactory validatorFactory = configuration
     .messageInterpolator(
         new MyMessageInterpolator(
             configuration.getDefaultMessageInterpolator()))
     .constraintValidatorFactory(
         new MyConstraintValidatorFactory(
             configuration.getDefaultConstraintValidatorFactory()))
     .ignoreXmlConfiguration()
     .buildValidatorFactory();
     
 Validator validator = validatorFactory.getValidator();

 //3. Providerspezifische Konfiguration
 HibernateValidatorConfiguration configuration = 
     Validation.byProvider(HibernateValidator.class).configure();


07.04.2010                     Bean Validation API                       23/29
Integration mit anderen APIs

 • JPA 2
      – Validierung vor Insert, Update (& Delete)
      – Kein Nachladen aus der DB
      – Berücksichtigung von Constraints für DDL
 • JSF 2
      – Autom. Validierung aller gebundenen Properties
      – Wichtig: javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL = true
 • Java EE 6
      –   Injektion von ValidatorFactory und Validator:

     @Resource
     private ValidatorFactory validatorFactory;

     @Resource
     private Validator validator;



07.04.2010                      Bean Validation API                          24/29
07.04.2010   Bean Validation API   /29
Neues in Hibernate Validator 4.1

 • Annotation Processor: Constraintprüfung zur Compile-Zeit
 • Neue Constraints
      –   @CreditCardNumber
      –   @NotBlank
      –   @URL
      –   @ScriptAssert:
 •
 @ScriptAssert(lang = "jexl", script = "_this.startDate < _this.endDate")
 public class CalendarEvent {
 •
     private Date startDate;
 •
     private Date endDate;
 •
     //constructor, getter, setter ...
 } RBL
 •



07.04.2010                     Bean Validation API                          26/29
07.04.2010   Bean Validation API   /29
Fragen & Antworten




             ?!
07.04.2010   Bean Validation API       28/29
Referenzen

 • JSR 303: “Bean Validation”:
   http://jcp.org/en/jsr/detail?id=303
 • Hibernate Validator 4.0:
   http://www.hibernate.org/subprojects/validator.html
 • Hibernate Validator Reference Guide:
   http://docs.jboss.org/hibernate/stable/validator/reference/
   en/html/
 • Forum zu Hibernate Validator:
   https://forum.hibernate.org/viewforum.php?f=9
 • Musings of a programming Addict – Artikel zu BV:
   http://musingsofaprogrammingaddict.blogspot.com/search/
   label/Bean%20Validation



07.04.2010                Bean Validation API                29/29

Weitere ähnliche Inhalte

Was ist angesagt?

2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 
Auszug Seminarmaterial "EJB 3.x"
Auszug Seminarmaterial "EJB 3.x"Auszug Seminarmaterial "EJB 3.x"
Auszug Seminarmaterial "EJB 3.x"schellsoft
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Ralf Sigmund
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Michael Kurz
 
Jm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashornJm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashornWolfgang Weigend
 

Was ist angesagt? (6)

2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
Auszug Seminarmaterial "EJB 3.x"
Auszug Seminarmaterial "EJB 3.x"Auszug Seminarmaterial "EJB 3.x"
Auszug Seminarmaterial "EJB 3.x"
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
 
Java EE 5
Java EE 5Java EE 5
Java EE 5
 
Jm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashornJm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashorn
 

Andere mochten auch

Cabilao Island
Cabilao IslandCabilao Island
Cabilao IslandYayo Cruz
 
Roofer westchester county ny
Roofer westchester county nyRoofer westchester county ny
Roofer westchester county nylakshmi durga
 
E-Commerce Markt und Technik
E-Commerce Markt und TechnikE-Commerce Markt und Technik
E-Commerce Markt und TechnikUli Häfele
 
Direcciones de ejercicios de fisica
Direcciones de ejercicios de fisicaDirecciones de ejercicios de fisica
Direcciones de ejercicios de fisicaAlexander Solarte
 
The NHS Five Year Plan-Bryan fernandez presentation
The NHS Five Year Plan-Bryan fernandez presentationThe NHS Five Year Plan-Bryan fernandez presentation
The NHS Five Year Plan-Bryan fernandez presentationmckenln
 
Twitter para todos e-book gratuito del blog estrategias marketing online para...
Twitter para todos e-book gratuito del blog estrategias marketing online para...Twitter para todos e-book gratuito del blog estrategias marketing online para...
Twitter para todos e-book gratuito del blog estrategias marketing online para...Miguel García Pérez
 
Borang pk 07 4 rekod edaran
Borang pk 07 4 rekod edaranBorang pk 07 4 rekod edaran
Borang pk 07 4 rekod edaranMohd Zaizo Izani
 
Presentación Juliano Tubino - eCommerce Day Santiago 2016
Presentación Juliano Tubino - eCommerce Day Santiago 2016Presentación Juliano Tubino - eCommerce Day Santiago 2016
Presentación Juliano Tubino - eCommerce Day Santiago 2016eCommerce Institute
 
Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...
Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...
Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...contactOpinionWay
 

Andere mochten auch (13)

05 02 09 medicinals plants oms www.gftaognosticaespiritual.org
05 02 09 medicinals plants oms www.gftaognosticaespiritual.org05 02 09 medicinals plants oms www.gftaognosticaespiritual.org
05 02 09 medicinals plants oms www.gftaognosticaespiritual.org
 
Cabilao Island
Cabilao IslandCabilao Island
Cabilao Island
 
Val Cap
Val CapVal Cap
Val Cap
 
Sie 3 esperanza-lozoya
Sie 3 esperanza-lozoyaSie 3 esperanza-lozoya
Sie 3 esperanza-lozoya
 
Roofer westchester county ny
Roofer westchester county nyRoofer westchester county ny
Roofer westchester county ny
 
E-Commerce Markt und Technik
E-Commerce Markt und TechnikE-Commerce Markt und Technik
E-Commerce Markt und Technik
 
Direcciones de ejercicios de fisica
Direcciones de ejercicios de fisicaDirecciones de ejercicios de fisica
Direcciones de ejercicios de fisica
 
Alquimia personal
Alquimia personalAlquimia personal
Alquimia personal
 
The NHS Five Year Plan-Bryan fernandez presentation
The NHS Five Year Plan-Bryan fernandez presentationThe NHS Five Year Plan-Bryan fernandez presentation
The NHS Five Year Plan-Bryan fernandez presentation
 
Twitter para todos e-book gratuito del blog estrategias marketing online para...
Twitter para todos e-book gratuito del blog estrategias marketing online para...Twitter para todos e-book gratuito del blog estrategias marketing online para...
Twitter para todos e-book gratuito del blog estrategias marketing online para...
 
Borang pk 07 4 rekod edaran
Borang pk 07 4 rekod edaranBorang pk 07 4 rekod edaran
Borang pk 07 4 rekod edaran
 
Presentación Juliano Tubino - eCommerce Day Santiago 2016
Presentación Juliano Tubino - eCommerce Day Santiago 2016Presentación Juliano Tubino - eCommerce Day Santiago 2016
Presentación Juliano Tubino - eCommerce Day Santiago 2016
 
Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...
Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...
Opinion way pour la radio RAJE : Les Français et la radio numérique terrestre...
 

Ähnlich wie Objektvalidierung mit dem Bean Validation Api

DACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdfDACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdfDNUG e.V.
 
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdfDACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdfDNUG e.V.
 
Zeitnahe Reaktion auf Verordnungsänderungen mit Feature Toggles
Zeitnahe Reaktion auf Verordnungsänderungen mit Feature TogglesZeitnahe Reaktion auf Verordnungsänderungen mit Feature Toggles
Zeitnahe Reaktion auf Verordnungsänderungen mit Feature TogglesBATbern
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascriptjoergreichert
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklungjlink
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTddjlink
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile ServicesSascha Dittmann
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenHendrik Lösch
 
Ivory Soa Suite
Ivory Soa SuiteIvory Soa Suite
Ivory Soa SuitePredrag61
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardOPEN KNOWLEDGE GmbH
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJSSebastian Springer
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersUlrich Krause
 
Camunda@1&1
Camunda@1&1Camunda@1&1
Camunda@1&11&1
 
MEAN SCS in der Cloud
MEAN SCS in der CloudMEAN SCS in der Cloud
MEAN SCS in der CloudTorsten Fink
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere RESTMartin Abraham
 

Ähnlich wie Objektvalidierung mit dem Bean Validation Api (20)

DACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdfDACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Die Domino REST API - Konzepte und Hintergruende.pdf
 
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdfDACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
 
GWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der PraxisGWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der Praxis
 
Zeitnahe Reaktion auf Verordnungsänderungen mit Feature Toggles
Zeitnahe Reaktion auf Verordnungsänderungen mit Feature TogglesZeitnahe Reaktion auf Verordnungsänderungen mit Feature Toggles
Zeitnahe Reaktion auf Verordnungsänderungen mit Feature Toggles
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascript
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklung
 
SharePoint Claims und FBA
SharePoint Claims und FBASharePoint Claims und FBA
SharePoint Claims und FBA
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Services
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf Steroiden
 
GWT
GWTGWT
GWT
 
Ivory Soa Suite
Ivory Soa SuiteIvory Soa Suite
Ivory Soa Suite
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative Standard
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
 
Camunda@1&1
Camunda@1&1Camunda@1&1
Camunda@1&1
 
MEAN SCS in der Cloud
MEAN SCS in der CloudMEAN SCS in der Cloud
MEAN SCS in der Cloud
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere REST
 

Objektvalidierung mit dem Bean Validation Api