Bean Validation 2.0Support für Java 8 und mehr
Gunnar Morling, Red Hat
1
Was erwartet Euch?Was ist Bean Validation?
Was ist neu in Bean Validation 2.0?
Feedback geben
2
Gunnar MorlingOpensource-Softwareentwickler bei Red Hat
Div. Hibernate-Projekte
Spec Lead für Bean Validation 2.0
Andere Projekte: ModiTect, MapStruct
@gunnarmorling
http://in.relation.to/gunnar-morling/
3
Was ist Bean Validation?"Constraint once, validate everywhere"
Constraints für JavaBeans
Validierung per API oder automatisch
JPA
JSF, Spring MVC, GWT
JAX-RS
Erweiterbar (eigene Constraints)
BV 1.1: Methodenvalidierung
4
Demo
5
Bean Validation 2.0 - JSR 380
Einsatz der neuen Sprachfeatures
Unterstützung der API-Erweiterungen
6
Wiederholbare Annotationen
@Size.List({ @Size(min = 8, group = Default.class), @Size(min = 12, group = Admin.class)})private char[] password = ...;
7
Wiederholbare Annotationen
@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
Validierung von Collections
private List<String> names;
9
Validierung von Collections
private List<String> names;
@Size(max=10)private List<String> names;
10
Validierung von Collections
private List<String> names;
@Size(max=10)private List<@Pattern(regexp="[a-zA-Z]*") String> names;
@Size(max=10)private List<String> names;
11
Validierung von Collections
private List<String> names;
@Size(max=10)private List<@Size(max=50) String> names;
@Size(max=10)private List<@Pattern(regexp="[a-zA-Z]*") String> names;
@Size(max=10)private List<String> names;
12
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})@Retention(RUNTIME)@Repeatable(List.class)@Documented@Constraint(validatedBy = { })public @interface Size { ...}
Typ-Annotationen (JSR 308)Neuer ElementType TYPE_USE
13
Kaskadierung
@Validprivate List<Address> addresses;
14
Kaskadierung
@Validprivate List<Address> addresses;
private List<@Valid Address> addresses;
15
Kaskadierung
@Validprivate List<Address> addresses;
private List<@Valid Address> addresses;
private Map<@Valid Comment, @Min(0) @Max(5) Integer> scorePerComment;
16
Kaskadierung
@Validprivate List<Address> addresses;
private List<@Valid Address> addresses;
private Map<@Valid Comment, @Min(0) @Max(5) Integer> scorePerComment;
private Address @NotNull @Valid[] addresses;
17
java.util.Optional
Neuer ElementType TYPE
Auch für StringProperty et al. (JavaFX)
Optional<@Email String> getEmail() { ... };
18
Eigene ContainerSpezifische Kollektionstypen (z.B. Google Guava)
Andere JVM-Sprachen (Ceylon, Scala etc.)
Unterstützt mittels Extractor-SPI
private Table<Year, String, Integer> revenuePerYearAndCategory;
19
Eigene ContainerSpezifische Kollektionstypen (z.B. Google Guava)
Andere JVM-Sprachen (Ceylon, Scala etc.)
Unterstützt mittels Extractor-SPI
private Table<Year, String, Integer> revenuePerYearAndCategory;
private Table<Year, String, @DecimalMin(value="0", inclusive=false) Integer> revenuePerYearAndCategory;
20
Demo
21.1
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() ); } }}
21.2
java.time API (JSR 310)@Past/@Future erlaubt für java.time.LocalDateTime,
ZonedDateTime etc.
@Pastprivate Year inceptionYear = Year.of( 2017 );
22
java.time API (JSR 310)@Past/@Future erlaubt für java.time.LocalDateTime,
ZonedDateTime etc.
@Pastprivate Year inceptionYear = Year.of( 2017 );
@Past(orPresent=true)private Year inceptionYear = Year.of( 2017 );
23
java.time API (JSR 310)
ValidatorFactory vf = Validation.byDefaultProvider() .configure() .clockProvider( new FixedClockProvider( ZonedDateTime.of( 2016, 6, 15, 0, 0, 0, 0, ZoneId.of( "Europe/Paris" ) ) ) ) .buildValidatorFactory();
24
Weitere Java 8 GoodiesConstraintValidator ohne 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; }}
25
DiversesNeue Constraints
@NotEmpty, @NotBlank
@Positive, @Negative
ValidatorFactory implementiert AutoCloseable
try ( ValidatorFactory vf = Validation.buildDefaultValidatorFactory() ) { }
26
JSF 2.3 und JAX-RS 2.1JSF: Validierung von Class-Level-Constraints
JAX-RS
Berücksichtigung des
Request Locale
Option zur Deaktivierung
von Bean Validation
27
StatusSpec: Early Draft
Referenzimplementierung: Hibernate Validator 6.0 Alpha2
Feedback erwünscht :-)
Public Draft: April
Bestandteil von Java EE 8 (Juli 2017)
28
ResourcenWie mitmachen:
API, Spezifikation, TCK, Website:
Referenzimplementierung:
Alles ist Open Source (Apache License 2.0)
beanvalidation.org/contribute/
github.com/beanvalidation/
github.com/hibernate/hibernate-validator/
29
30