keeping your data sane with bean validation 2€¦ · jsf, spring mvc, gwt jax-rs extensible...
TRANSCRIPT
Keeping Your Data Sane withBean Validation 2.0
Gunnar Morling@gunnarmorling
1
AgendaWhat is Bean Validation?
What's new in Bean Validation 2.0?
Questions
2
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
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
Demo
5
Bean Validation 2.0 - JSR 380
Benefit from new Java 8 language features
Support for API extensions
6
Use Case: Different Passwordsfor Different Roles
@Size.List({ @Size(min = 8, group = Default.class), @Size(min = 12, group = Admin.class)})private char[] password = ...;
7
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
Use Case: Ensure Non-EmptyCollection Elements
private List<String> names;
9
Use Case: Ensure Non-EmptyCollection Elements
private List<String> names;
@NotEmptyprivate List<String> names;
10
Use Case: Ensure Non-EmptyCollection Elements
private List<String> names;
@OnElements(constraint=@NotEmpty)private List<String> names;
11
Use Case: Ensure Non-EmptyCollection Elements
private List<String> names;
private List<@NotEmpty String> names;
@OnElements(constraint=@NotEmpty)private List<String> names;
12
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
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
@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
Cascaded Validation
@Validprivate List<Address> addresses;
16
Cascaded Validation
@Validprivate List<Address> addresses;
private List<@Valid Address> addresses;
17
Cascaded Validation
@Validprivate List<Address> addresses;
private List<@Valid Address> addresses;
private Map<@Valid Comment, Integer> scorePerComment;
18
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
Further Supported ContainersOptional, OptionalInt, OptionalLong, OptionalDouble
JavaFX's property types
Optional<@Email String> getEmail() { ... };
20
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
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
Demo
23
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
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
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
New Constraints@NotEmpty, @NotBlank
@Positive, @PositiveOrZero , @Negative, @NegativeOrZero
@PastOrPresent, @FutureOrPresent
27
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
StatusReleased final
version in August
Reference implementation:
Hibernate Validator 6.0
29
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
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
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
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
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
33