Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Agenda What is Bean Validation? What's new in Bean Validation 2.0? Questions, feedback 2

Slide 3

Slide 3 text

Gunnar Morling Open source software engineer at Red Hat Hibernate Debezium Spec Lead for Bean Validation 2.0 Other projects: ModiTect, MapStruct [email protected] @gunnarmorling http://in.relation.to/gunnar-morling/ 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Demo 5

Slide 6

Slide 6 text

Bean Validation 2.0 - JSR 380 Benefit from new language features Support for API extensions 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Use Case: Ensure Non-Empty Collection Elements private List names; 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

@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

Slide 16

Slide 16 text

Cascaded Validation @Valid private List
addresses; 16

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Further Supported Containers Optional, OptionalInt, OptionalLong, OptionalDouble JavaFX's property types Optional<@Email String> getEmail() { ... }; 20

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Demo 23

Slide 24

Slide 24 text

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() ); } } } 24

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Other Java 8 Goodies Real parameter names in error messages ConstraintValidator without 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; } } 28

Slide 29

Slide 29 text

New Constraints @NotEmpty, @NotBlank @Email @Positive, @PositiveOrZero , @Negative, @NegativeOrZero 29

Slide 30

Slide 30 text

Status Passed Public Review Ballot last week 30

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

34