Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Bean Validation 2.0 - Support für Java 8 und mehr
Search
Gunnar Morling
March 28, 2017
Programming
0
200
Bean Validation 2.0 - Support für Java 8 und mehr
Learn what's coming in Bean Validation 2.0 (JSR 380); Slides from JavaLand 2017 (German)
Gunnar Morling
March 28, 2017
Tweet
Share
More Decks by Gunnar Morling
See All by Gunnar Morling
1BRC–Nerd Sniping the Java Community
gunnarmorling
0
79
Data Contracts In Practice With Debezium and Apache Flink
gunnarmorling
1
610
1BRC – Nerd Sniping the Java Community (JavaZone)
gunnarmorling
0
110
Syncing your Database To OpenSearch In Real-Time (JCON Slovenia)
gunnarmorling
0
110
1BRC – Nerd Sniping the Java Community (Keynote JCon Slovenia)
gunnarmorling
1
350
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
490
Data Contracts In Practice With Debezium and Apache Flink (Kafka Summit London)
gunnarmorling
2
820
From Postgres to OpenSearch in No Time
gunnarmorling
1
1k
Debezium Snapshots Revisited! (Current '23)
gunnarmorling
1
310
Other Decks in Programming
See All in Programming
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
Pulsar2 を雰囲気で使ってみよう
anoken
0
240
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
560
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
230
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
340
Honoのおもしろいミドルウェアをみてみよう
yusukebe
1
210
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
110
『品質』という言葉が嫌いな理由
korimu
0
160
楽しく向き合う例外対応
okutsu
0
100
SwiftUI Viewの責務分離
elmetal
PRO
1
230
昭和の職場からアジャイルの世界へ
kumagoro95
1
380
Featured
See All Featured
Being A Developer After 40
akosma
89
590k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
BBQ
matthewcrist
87
9.5k
How STYLIGHT went responsive
nonsquared
98
5.4k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
A Tale of Four Properties
chriscoyier
158
23k
Unsuck your backbone
ammeep
669
57k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Side Projects
sachag
452
42k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Faster Mobile Websites
deanohume
306
31k
Transcript
Bean Validation 2.0 Support 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 Morling Opensource-Softwareentwickler bei Red Hat Div. Hibernate-Projekte Spec Lead
für Bean Validation 2.0 Andere Projekte: ModiTect, MapStruct
[email protected]
@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 @Valid private List<Address> addresses; 14
Kaskadierung @Valid private List<Address> addresses; private List<@Valid Address> addresses; 15
Kaskadierung @Valid private List<Address> addresses; private List<@Valid Address> addresses; private
Map<@Valid Comment, @Min(0) @Max(5) Integer> scorePerComment; 16
Kaskadierung @Valid private 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 Container Spezifische Kollektionstypen (z.B. Google Guava) Andere JVM-Sprachen (Ceylon,
Scala etc.) Unterstützt mittels Extractor-SPI private Table<Year, String, Integer> revenuePerYearAndCategory; 19
Eigene Container Spezifische 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.
@Past private Year inceptionYear = Year.of( 2017 ); 22
java.time API (JSR 310) @Past/@Future erlaubt für java.time.LocalDateTime, ZonedDateTime etc.
@Past private 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 Goodies ConstraintValidator 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
Diverses Neue Constraints @NotEmpty, @NotBlank @Email @Positive, @Negative ValidatorFactory implementiert
AutoCloseable try ( ValidatorFactory vf = Validation.buildDefaultValidatorFactory() ) { } 26
JSF 2.3 und JAX-RS 2.1 JSF: Validierung von Class-Level-Constraints JAX-RS
Berücksichtigung des Request Locale Option zur Deaktivierung von Bean Validation 27
Status Spec: Early Draft Referenzimplementierung: Hibernate Validator 6.0 Alpha2 Feedback
erwünscht :-) Public Draft: April Bestandteil von Java EE 8 (Juli 2017) 28
Resourcen Wie 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