keeping your data sane with bean validation 2€¦ · jsf, spring mvc, gwt jax-rs extensible...

35
Keeping Your Data Sane with Bean Validation 2.0 Gunnar Morling @gunnarmorling 1

Upload: others

Post on 08-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Keeping Your Data Sane withBean Validation 2.0

Gunnar Morling@gunnarmorling

1

Page 2: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

AgendaWhat is Bean Validation?

What's new in Bean Validation 2.0?

Questions

2

Page 3: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Gunnar MorlingOpen source software engineer at Red Hat

Debezium

Hibernate

Spec Lead for Bean Validation 2.0

Other projects: ModiTect, MapStruct

[email protected]

@gunnarmorling

http://in.relation.to/gunnar-morling/

3

Page 4: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

What is Bean Validation?"Constrain 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

Page 5: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Demo

5

Page 6: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Bean Validation 2.0 - JSR 380

Benefit from new Java 8 language features

Support for API extensions

6

Page 7: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Different Passwordsfor Different Roles

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

7

Page 8: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Different Passwordsfor 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

Page 9: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Ensure Non-EmptyCollection Elements

private List<String> names;

9

Page 10: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Ensure Non-EmptyCollection Elements

private List<String> names;

@NotEmptyprivate List<String> names;

10

Page 11: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Ensure Non-EmptyCollection Elements

private List<String> names;

@OnElements(constraint=@NotEmpty)private List<String> names;

11

Page 12: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Ensure Non-EmptyCollection Elements

private List<String> names;

private List<@NotEmpty String> names;

@OnElements(constraint=@NotEmpty)private List<String> names;

12

Page 13: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Ensure Non-EmptyCollection Elements

private List<String> names;

private List<@NotEmpty @Pattern(regexp="[a-zA-Z]*") String> names;

@OnElements(constraint=@NotEmpty)private List<String> names;

13

Page 14: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

private List<@NotEmpty @Pattern(regexp="[a-zA-Z]*") String> names;

Use Case: Ensure Non-EmptyCollection Elements

private List<String> names;

@NotEmptyprivate List<@NotEmpty String> names;

@OnElements(constraint=@NotEmpty)private List<String> names;

14

Page 15: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

@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

Page 16: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Cascaded Validation

@Validprivate List<Address> addresses;

16

Page 17: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Cascaded Validation

@Validprivate List<Address> addresses;

private List<@Valid Address> addresses;

17

Page 18: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Cascaded Validation

@Validprivate List<Address> addresses;

private List<@Valid Address> addresses;

private Map<@Valid Comment, Integer> scorePerComment;

18

Page 19: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Cascaded Validation

@Validprivate List<Address> addresses;

private List<@Valid Address> addresses;

private Map<@Valid Comment, Integer> scorePerComment;

private Map<@Valid AddressType, List<@Valid Address>> addressesByType;

19

Page 20: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Further Supported ContainersOptional, OptionalInt, OptionalLong, OptionalDouble

JavaFX's property types

Optional<@Email String> getEmail() { ... };

20

Page 21: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Custom ContainersSpecific collection types (e.g. Google Guava)

Other JVM languages (Ceylon, Scala etc.)

Enabled via Extractor SPI

private Table<Year, String, Integer> revenuePerYearAndCategory;

21

Page 22: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

private Table<Year, String, Integer> revenuePerYearAndCategory;

private Table<Year, String, @Positive Integer> revenuePerYearAndCategory;

Custom ContainersSpecific collection types (e.g. Google Guava)

Other JVM languages (Ceylon, Scala etc.)

Enabled via Extractor SPI

22

Page 23: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Demo

23

Page 24: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Delivery Date in theFuture

@Past/@Future supported for JSR 310 types:

java.time.LocalDateTime, ZonedDateTime etc.

@Futureprivate LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12);

24

Page 25: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Use Case: Delivery Date in theFuture

@Past/@Future supported for JSR 310 types:

java.time.LocalDateTime, ZonedDateTime etc.

@FutureOrPresentprivate LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12);

@Futureprivate LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12);

25

Page 26: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

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

26

Page 27: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

New Constraints@NotEmpty, @NotBlank

@Email

@Positive, @PositiveOrZero , @Negative, @NegativeOrZero

@PastOrPresent, @FutureOrPresent

27

Page 28: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Other Java 8 GoodiesReal 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

Page 29: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

StatusReleased final

version in August

Reference implementation:

Hibernate Validator 6.0

29

Page 30: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Final ReleasePart of Java EE 8

Contained in GlassFish 5; easy-to-use patch for WildFly

Supported by Spring 5

Everything open source: spec, API, TCK and reference

implementation

30

Page 31: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

SummarySupport for container-element constraints

Repeatable constraints

New constraint types

Improved date/time support

ConstraintValidator#initialize() is a default method

http://beanvalidation.org/2.0/spec/#whatsnew-20

31.1

Page 32: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Outlook Bean Validation 2.1Constraint-API

ConstraintMapping mapping = ...;

mapping.type( Marathon.class ) .property( "numberOfHelpers", FIELD ) .constraint( new MinDef().value( 1 ) ) .property( "runners", METHOD ) .valid();

31.2

Page 33: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Outlook Bean Validation 2.1Constraint-API

ConstraintMapping mapping = ...;

mapping.type( Marathon.class ) .property( "numberOfHelpers", FIELD ) .constraint( new MinDef().value( 1 ) ) .property( "runners", METHOD ) .valid();

mapping.constraintDefinition( FileExists.class ) .validateType( File.class ) .with( f -> f.exists() );

Constraint-API: Lambda

31.3

Page 34: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

Resources

Spec

Reference implementation

API, specifikation, TCK, website

Contributions welcome!

@gunnarmorling

http://beanvalidation.org/2.0/spec/

github.com/hibernate/hibernate-validator/

github.com/beanvalidation/

32

Page 35: Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible (custom constraints) BV 1.1: method validation 4. Demo 5. Bean Validation 2.0 - JSR 380

33