Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bean Validation 2.0 - Support für Java 8 und mehr

Bean Validation 2.0 - Support für Java 8 und mehr

Learn what's coming in Bean Validation 2.0 (JSR 380); Slides from JavaLand 2017 (German)

8e25c0ca4bf25113bd9c0ccc5d118164?s=128

Gunnar Morling

March 28, 2017
Tweet

More Decks by Gunnar Morling

Other Decks in Programming

Transcript

  1. Bean Validation 2.0 Support für Java 8 und mehr Gunnar

    Morling, Red Hat 1
  2. Was erwartet Euch? Was ist Bean Validation? Was ist neu

    in Bean Validation 2.0? Feedback geben 2
  3. Gunnar Morling Opensource-Softwareentwickler bei Red Hat Div. Hibernate-Projekte Spec Lead

    für Bean Validation 2.0 Andere Projekte: ModiTect, MapStruct gunnar@hibernate.org @gunnarmorling http://in.relation.to/gunnar-morling/ 3
  4. Was ist Bean Validation? "Constraint once, validate everywhere" Constraints für

    JavaBeans Validierung per API oder automatisch ​ JPA JSF, Spring MVC, GWT JAX-RS Erweiterbar (eigene Constraints) BV 1.1: ​ Methodenvalidierung 4
  5. Demo 5

  6. Bean Validation 2.0 - JSR 380 Einsatz der neuen Sprachfeatures

    Unterstützung der API-Erweiterungen 6
  7. Wiederholbare Annotationen @Size.List({ @Size(min = 8, group = Default.class), @Size(min

    = 12, group = Admin.class) }) private char[] password = ...; 7
  8. Wiederholbare Annotationen @Size.List({ @Size(min = 8, group = Default.class), @Size(min

    = 12, group = Admin.class) }) private char[] password = ...; @Size(min = 8, group = Default.class) @Size(min = 12, group = Admin.class) private char[] password = ...; 8
  9. Validierung von Collections private List<String> names; 9

  10. Validierung von Collections private List<String> names; @Size(max=10) private List<String> names;

    10
  11. Validierung von Collections private List<String> names; @Size(max=10) private List<@Pattern(regexp="[a-zA-Z]*") String>

    names; @Size(max=10) private List<String> names; 11
  12. Validierung von Collections private List<String> names; @Size(max=10) private List<@Size(max=50) String>

    names; @Size(max=10) private List<@Pattern(regexp="[a-zA-Z]*") String> names; @Size(max=10) private List<String> names; 12
  13. @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Repeatable(List.class)

    @Documented @Constraint(validatedBy = { }) public @interface Size { ... } Typ-Annotationen (JSR 308) Neuer ElementType TYPE_USE 13
  14. Kaskadierung @Valid private List<Address> addresses; 14

  15. Kaskadierung @Valid private List<Address> addresses; private List<@Valid Address> addresses; 15

  16. Kaskadierung @Valid private List<Address> addresses; private List<@Valid Address> addresses; private

    Map<@Valid Comment, @Min(0) @Max(5) Integer> scorePerComment; 16
  17. Kaskadierung @Valid private List<Address> addresses; private List<@Valid Address> addresses; private

    Map<@Valid Comment, @Min(0) @Max(5) Integer> scorePerComment; private Address @NotNull @Valid[] addresses; 17
  18. java.util.Optional Neuer ElementType TYPE Auch für StringProperty et al. (JavaFX)

    Optional<@Email String> getEmail() { ... }; 18
  19. Eigene Container Spezifische Kollektionstypen (z.B. Google Guava) Andere JVM-Sprachen (Ceylon,

    Scala etc.) Unterstützt mittels Extractor-SPI private Table<Year, String, Integer> revenuePerYearAndCategory; 19
  20. Eigene Container Spezifische Kollektionstypen (z.B. Google Guava) Andere JVM-Sprachen (Ceylon,

    Scala etc.) Unterstützt mittels Extractor-SPI private Table<Year, String, Integer> revenuePerYearAndCategory; private Table< Year, String, @DecimalMin(value="0", inclusive=false) Integer> revenuePerYearAndCategory; 20
  21. Demo 21.1

  22. class TableValueExtractor implements ValueExtractor<Table<?, ?, @ExtractedValue ?>> { @Override public

    void extractValues(Table<?, ?, ?> originalValue, ValueExtractor.ValueReceiver receiver) { for ( Cell<?, ?, ?> cell : originalValue.cellSet() ) { receiver.keyedValue( "<table cell>", new CellKey( cell.getRowKey(), cell.getColumnKey() ), cell.getValue() ); } } } 21.2
  23. java.time API (JSR 310) @Past/@Future erlaubt für java.time.LocalDateTime, ZonedDateTime etc.

    @Past private Year inceptionYear = Year.of( 2017 ); 22
  24. java.time API (JSR 310) @Past/@Future erlaubt für java.time.LocalDateTime, ZonedDateTime etc.

    @Past private Year inceptionYear = Year.of( 2017 ); @Past(orPresent=true) private Year inceptionYear = Year.of( 2017 ); 23
  25. java.time API (JSR 310) ValidatorFactory vf = Validation.byDefaultProvider() .configure() .clockProvider(

    new FixedClockProvider( ZonedDateTime.of( 2016, 6, 15, 0, 0, 0, 0, ZoneId.of( "Europe/Paris" ) ) ) ) .buildValidatorFactory(); 24
  26. Weitere Java 8 Goodies ConstraintValidator ohne initialize() public class NotNullValidator

    implements ConstraintValidator<NotNull, Object> { public void initialize(NotNull constraintAnnotation) { } public boolean isValid(Object object, ConstraintValidatorContext ctx) { return object != null; } } public class NotNullValidator implements ConstraintValidator<NotNull, Object> { public boolean isValid(Object object, ConstraintValidatorContext ctx) { return object != null; } } 25
  27. Diverses Neue Constraints @NotEmpty, @NotBlank @Email @Positive, @Negative ValidatorFactory implementiert

    AutoCloseable try ( ValidatorFactory vf = Validation.buildDefaultValidatorFactory() ) { } 26
  28. JSF 2.3 und JAX-RS 2.1 JSF: Validierung von Class-Level-Constraints JAX-RS

    Berücksichtigung des Request Locale Option zur Deaktivierung von Bean Validation 27
  29. Status Spec: Early Draft Referenzimplementierung: Hibernate Validator 6.0 Alpha2 Feedback

    erwünscht :-) Public Draft: April Bestandteil von Java EE 8 (Juli 2017) 28
  30. Resourcen Wie mitmachen: API, Spezifikation, TCK, Website: Referenzimplementierung: Alles ist

    Open Source (Apache License 2.0) beanvalidation.org/contribute/ github.com/beanvalidation/ github.com/hibernate/hibernate-validator/ 29
  31. 30