Einführung Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible...
Transcript of Keeping Your Data Sane with Bean Validation 2€¦ · JSF, Spring MVC, GWT JAX-RS Extensible...
![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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/1.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/2.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/3.jpg)
Gunnar MorlingOpen source software engineer at Red Hat
Debezium
Hibernate
Spec Lead for Bean Validation 2.0
Other projects: ModiTect, MapStruct
@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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/4.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/5.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/6.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/7.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/8.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/9.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/10.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/11.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/12.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/13.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/14.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/15.jpg)
@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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/16.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/17.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/18.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/19.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/20.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/21.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/22.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/23.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/24.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/25.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/26.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/27.jpg)
New Constraints@NotEmpty, @NotBlank
@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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/28.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/29.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/30.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/31.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/32.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/33.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/34.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022042413/5f2cce769782386a6d59a35c/html5/thumbnails/35.jpg)
33