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)

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

    View full-size slide

  2. Was erwartet Euch?
    Was ist Bean Validation?
    Was ist neu in Bean Validation 2.0?
    Feedback geben
    2

    View full-size slide

  3. Gunnar Morling
    Opensource-Softwareentwickler bei Red Hat
    Div. Hibernate-Projekte
    Spec Lead für Bean Validation 2.0
    Andere Projekte: ModiTect, MapStruct
    [email protected]
    @gunnarmorling
    http://in.relation.to/gunnar-morling/
    3

    View full-size slide

  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

    View full-size slide

  5. Bean Validation 2.0 - JSR 380
    Einsatz der neuen Sprachfeatures
    Unterstützung der API-Erweiterungen
    6

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. Validierung von Collections
    private List names;
    9

    View full-size slide

  9. Validierung von Collections
    private List names;
    @Size(max=10)
    private List names;
    10

    View full-size slide

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

    View full-size slide

  11. Validierung von Collections
    private List 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 names;
    12

    View full-size slide

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

    View full-size slide

  13. Kaskadierung
    @Valid
    private List addresses;
    14

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. java.util.Optional
    Neuer ElementType TYPE
    Auch für StringProperty et al. (JavaFX)
    Optional<@Email String> getEmail() { ... };
    18

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  20. class TableValueExtractor implements
    ValueExtractor> {
    @Override
    public void extractValues(Table, ?, ?> originalValue,
    ValueExtractor.ValueReceiver receiver) {
    for ( Cell, ?, ?> cell : originalValue.cellSet() ) {
    receiver.keyedValue(
    "",
    new CellKey( cell.getRowKey(), cell.getColumnKey() ),
    cell.getValue()
    );
    }
    }
    }
    21.2

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  24. Weitere Java 8 Goodies
    ConstraintValidator ohne initialize()
    public class NotNullValidator implements
    ConstraintValidator {
    public void initialize(NotNull constraintAnnotation) {
    }
    public boolean isValid(Object object,
    ConstraintValidatorContext ctx) {
    return object != null;
    }
    }
    public class NotNullValidator implements
    ConstraintValidator {
    public boolean isValid(Object object,
    ConstraintValidatorContext ctx) {
    return object != null;
    }
    }
    25

    View full-size slide

  25. Diverses
    Neue Constraints
    @NotEmpty, @NotBlank
    @Email
    @Positive, @Negative
    ValidatorFactory implementiert AutoCloseable
    try ( ValidatorFactory vf =
    Validation.buildDefaultValidatorFactory() ) {
    }
    26

    View full-size slide

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

    View full-size slide

  27. Status
    Spec: Early Draft
    Referenzimplementierung: Hibernate Validator 6.0 Alpha2
    Feedback erwünscht :-)
    Public Draft: April
    Bestandteil von Java EE 8 (Juli 2017)
    28

    View full-size slide

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

    View full-size slide