Keeping Your Data Sane with Bean Validation 2.0 (jdk.io)

Keeping Your Data Sane with Bean Validation 2.0 (jdk.io)

Introduction to the new features added in Bean Validation 2.0. Slides from a talk at the jdk.io conference in Copenhagen.

8e25c0ca4bf25113bd9c0ccc5d118164?s=128

Gunnar Morling

June 19, 2017
Tweet

Transcript

  1. Keeping Your Data Sane with Bean Validation 2.0 Gunnar Morling,

    Red Hat 1
  2. Agenda What is Bean Validation? What's new in Bean Validation

    2.0? Questions, feedback 2
  3. Gunnar Morling Open source software engineer at Red Hat Hibernate

    Debezium Spec Lead for Bean Validation 2.0 Other projects: ModiTect, MapStruct gunnar@hibernate.org @gunnarmorling http://in.relation.to/gunnar-morling/ 3
  4. What is Bean Validation? "Constraint once, validate everywhere" Constraints for

    JavaBeans Validation via API or automatically ​ JPA JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: ​ method validation 4
  5. Demo 5

  6. Bean Validation 2.0 - JSR 380 Benefit from new language

    features Support for API extensions 6
  7. Use Case: Different Passwords for Different Roles @Size.List({ @Size(min =

    8, group = Default.class), @Size(min = 12, group = Admin.class) }) private char[] password = ...; 7
  8. Use Case: Different Passwords for Different Roles @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. Use Case: Ensure Non-Empty Collection Elements private List<String> names; 9

  10. Use Case: Ensure Non-Empty Collection Elements private List<String> names; @NotEmpty

    private List<String> names; 10
  11. Use Case: Ensure Non-Empty Collection Elements private List<String> names; @OnElements(constraint=@NotEmpty)

    private List<String> names; 11
  12. Use Case: Ensure Non-Empty Collection Elements private List<String> names; private

    List<@NotEmpty String> names; @OnElements(constraint=@NotEmpty) private List<String> names; 12
  13. Use Case: Ensure Non-Empty Collection Elements private List<String> names; private

    List<@NotEmpty @Pattern(regexp="[a-zA-Z]*") String> names; @OnElements(constraint=@NotEmpty) private List<String> names; 13
  14. private List<@NotEmpty @Pattern(regexp="[a-zA-Z]*") String> names; Use Case: Ensure Non-Empty Collection

    Elements private List<String> names; @NotEmpty private List<@NotEmpty String> names; @OnElements(constraint=@NotEmpty) private List<String> names; 14
  15. @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Repeatable(List.class)

    @Documented @Constraint(validatedBy = { }) public @interface Size { ... } Type Annotations (JSR 308) New element type TYPE_USE 15
  16. Cascaded Validation @Valid private List<Address> addresses; 16

  17. Cascaded Validation @Valid private List<Address> addresses; private List<@Valid Address> addresses;

    17
  18. Cascaded Validation @Valid private List<Address> addresses; private List<@Valid Address> addresses;

    private Map<@Valid Comment, Integer> scorePerComment; 18
  19. Cascaded Validation @Valid private List<Address> addresses; private List<@Valid Address> addresses;

    private Map<@Valid Comment, Integer> scorePerComment; private Map<@Valid AddressType, List<@Valid Address>> addressesByType; 19
  20. Further Supported Containers Optional, OptionalInt, OptionalLong, OptionalDouble JavaFX's property types

    Optional<@Email String> getEmail() { ... }; 20
  21. Custom Containers Specific collection types (e.g. Google Guava) Other JVM

    languages (Ceylon, Scala etc.) Enabled via Extractor SPI private Table<Year, String, Integer> revenuePerYearAndCategory; 21
  22. private Table<Year, String, Integer> revenuePerYearAndCategory; private Table<Year, String, @Positive Integer>

    revenuePerYearAndCategory; Custom Containers Specific collection types (e.g. Google Guava) Other JVM languages (Ceylon, Scala etc.) Enabled via Extractor SPI 22
  23. Demo 23

  24. 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() ); } } } 24
  25. Use Case: Delivery Date in the Future @Past/@Future supported for

    JSR 310 types: java.time.LocalDateTime, ZonedDateTime etc. @Future private LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12 ); 25
  26. Use Case: Delivery Date in the Future @Past/@Future supported for

    JSR 310 types: java.time.LocalDateTime, ZonedDateTime etc. @Future(orPresent=true) private LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12 ); @Future private LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12 ); 26
  27. Use Case: Testing ValidatorFactory vf = Validation.byDefaultProvider() .configure() .clockProvider( new

    FixedClockProvider( ZonedDateTime.of( 2016, 6, 15, 0, 0, 0, 0, ZoneId.of( "Europe/Paris" ) ) ) ) .buildValidatorFactory(); 27
  28. Other Java 8 Goodies Real parameter names in error messages

    ConstraintValidator without 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; } } 28
  29. New Constraints @NotEmpty, @NotBlank @Email @Positive, @PositiveOrZero , @Negative, @NegativeOrZero

    29
  30. Status Passed Public Review Ballot last week 30

  31. Next Steps Proposed Final Draft this week Reference implementation: Hibernate

    Validator 6.0 Beta2 Your feedback is needed :-) Part of Java EE 8 (July 2017) 31
  32. Outlook Bean Validation 2.1 Constraint-API mapping.constraintDefinition( FileExists.class ) .validateType( File.class

    ) .with( f -> f.exists() ); Constraint-API: Lambda ConstraintMapping mapping = ...; mapping.type( Marathon.class ) .property( "numberOfHelpers", FIELD ) .constraint( new MinDef().value( 1 ) ) .property( "runners", METHOD ) .valid(); 32
  33. Resources All changes Reference implementation API, specifikation, TCK, website Everything

    is open source @gunnarmorling http://beanvalidation.org/latest-draft/diff-to-1.1/ github.com/hibernate/hibernate-validator/ github.com/beanvalidation/ 33
  34. 34