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
Neues in Bean Validation 2.0 - Support für Java...
Search
Gunnar Morling
September 29, 2017
Programming
0
120
Neues in Bean Validation 2.0 - Support für Java 8 und mehr
Slides from a talk on the new features in Bean Validation 2.0, given at code.talks 2017 (German).
Gunnar Morling
September 29, 2017
Tweet
Share
More Decks by Gunnar Morling
See All by Gunnar Morling
Mastering Postgres Replication Slots: Preventing WAL Bloat and Other Production Issues (JavaZone 2025)
gunnarmorling
0
73
Ins and Outs of the Outbox Pattern
gunnarmorling
1
630
1BRC–Nerd Sniping the Java Community
gunnarmorling
0
120
Data Contracts In Practice With Debezium and Apache Flink
gunnarmorling
1
770
1BRC – Nerd Sniping the Java Community (JavaZone)
gunnarmorling
0
150
Syncing your Database To OpenSearch In Real-Time (JCON Slovenia)
gunnarmorling
0
280
1BRC – Nerd Sniping the Java Community (Keynote JCon Slovenia)
gunnarmorling
1
390
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
540
Data Contracts In Practice With Debezium and Apache Flink (Kafka Summit London)
gunnarmorling
2
920
Other Decks in Programming
See All in Programming
AsyncSequenceとAsyncStreamのプロポーザルを全部読む!!
s_shimotori
1
230
Vueのバリデーション、結局どれを選べばいい? ― 自作バリデーションの限界と、脱却までの道のり ― / Which Vue Validation Library Should We Really Use? The Limits of Self-Made Validation and How I Finally Moved On
neginasu
3
1.8k
Node-REDのノードの開発・活用事例とコミュニティとの関わり(Node-RED Con Nagoya 2025)
404background
0
110
SwiftDataを使って10万件のデータを読み書きする
akidon0000
0
250
ビルドプロセスをデバッグしよう!
yt8492
0
220
Module Proxyのマニアックな話 / Niche Topics in Module Proxy
kuro_kurorrr
0
1.3k
EMこそClaude Codeでコード調査しよう
shibayu36
0
560
CSC509 Lecture 09
javiergs
PRO
0
280
モテるデスク環境
mozumasu
3
1.4k
業務でAIを使いたい話
hnw
0
220
マンガアプリViewerの大画面対応を考える
kk__777
0
440
AI Agent 時代的開發者生存指南
eddie
4
2.3k
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
Code Reviewing Like a Champion
maltzj
526
40k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Testing 201, or: Great Expectations
jmmastey
46
7.7k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
640
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
Fireside Chat
paigeccino
41
3.7k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.5k
Balancing Empowerment & Direction
lara
5
710
Gamification - CAS2011
davidbonilla
81
5.5k
Keith and Marios Guide to Fast Websites
keithpitt
412
23k
Transcript
Neues in Bean Validation 2.0 Support für Java 8 und
mehr Gunnar Morling, Red Hat @gunnarmorling 1
Agenda Was ist Bean Validation? Was gibt's Neues in Bean
Validation 2.0? Fragen 2
Gunnar Morling Opensource-Softwareentwickler bei Red Hat Debezium Hibernate 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? "Constrain once, validate everywhere" Constraints für
JavaBeans Validierung per API oder automatisch JPA JSF, Spring MVC, GWT JAX-RS Erweiterbar BV 1.1: Methodenvalidierung 4
Demo 5
Bean Validation 2.0 - JSR 380 Nutzung der neuen Sprachfeatures
von Java 8 Unterstützung der neuen APIs 6
Use Case: Passwortvalidierung basierend auf Nutzerrolle @Size.List({ @Size(min = 8,
group = Default.class), @Size(min = 12, group = Admin.class) }) private char[] password = ...; 7
@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 = ...; Use Case: Passwortvalidierung basierend auf Nutzerrolle 8
Use Case: Nicht-leere Listenelemente sicherstellen private List<String> names; 9
private List<String> names; @NotEmpty private List<String> names; Use Case: Nicht-leere
Listenelemente sicherstellen 10
private List<String> names; @OnElements(constraint=@NotEmpty) private List<String> names; Use Case: Nicht-leere
Listenelemente sicherstellen 11
private List<String> names; private List<@NotEmpty String> names; @OnElements(constraint=@NotEmpty) private List<String>
names; Use Case: Nicht-leere Listenelemente sicherstellen 12
private List<String> names; private List<@NotEmpty @Pattern(regexp="[a-zA-Z]*") String> names; @OnElements(constraint=@NotEmpty) private
List<String> names; Use Case: Nicht-leere Listenelemente sicherstellen 13
private List<@NotEmpty @Pattern(regexp="[a-zA-Z]*") String> names; private List<String> names; @NotEmpty private
List<@NotEmpty String> names; @OnElements(constraint=@NotEmpty) private List<String> names; Use Case: Nicht-leere Listenelemente sicherstellen 14
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Repeatable(List.class)
@Documented @Constraint(validatedBy = { }) public @interface Size { ... } Typannotationen (JSR 308) Neuer Elementtyp TYPE_USE 15
Kaskadierende Validierung @Valid private List<Address> addresses; 16
@Valid private List<Address> addresses; private List<@Valid Address> addresses; Kaskadierende Validierung
17
@Valid private List<Address> addresses; private List<@Valid Address> addresses; private Map<@Valid
Comment, Integer> scorePerComment; Kaskadierende Validierung 18
@Valid private List<Address> addresses; private List<@Valid Address> addresses; private Map<@Valid
Comment, Integer> scorePerComment; private Map<@Valid AddressType, List<@Valid Address>> addressesByType; Kaskadierende Validierung 19
Weitere unterstützte Container Optional, OptionalInt, OptionalLong, OptionalDouble Propertytypen von JavaFX
Optional<@Email String> getEmail() { ... }; 20
Eigene Container Spezifische Kollektionstypen (z.B. Google Guava) Andere JVM-Sprachen (Ceylon,
Scala etc.) Unterstützt per Extractor SPI private Table<Year, String, Integer> revenuePerYearAndCategory; 21
private Table<Year, String, Integer> revenuePerYearAndCategory; private Table<Year, String, @Positive Integer>
revenuePerYearAndCategory; Eigene Container Spezifische Kollektionstypen (z.B. Google Guava) Andere JVM-Sprachen (Ceylon, Scala etc.) Unterstützt per Extractor SPI 22
Demo 23
Use Case: Lieferdatum in der Zukunft @Past/@Future unterstützen JSR-310-Typen: java.time.LocalDateTime,
ZonedDateTime etc. @Future private LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12 ); 24
@FutureOrPresent private LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12 );
@Future private LocalDate deliveryDate = LocalDate.of( 2017, Month.MAY, 12 ); Use Case: Lieferdatum in der Zukunft @Past/@Future unterstützen JSR-310-Typen: java.time.LocalDateTime, ZonedDateTime etc. 25
Use Case: Testen ValidatorFactory vf = Validation.byDefaultProvider() .configure() .clockProvider( new
FixedClockProvider( ZonedDateTime.of( 2016, 6, 15, 0, 0, 0, 0, ZoneId.of( "Europe/Paris" ) ) ) ) .buildValidatorFactory(); 26
Neue Constraints @NotEmpty, @NotBlank @Email @Positive, @PositiveOrZero , @Negative, @NegativeOrZero
@PastOrPresent, @FutureOrPresent 27
Andere Java 8 Goodies Parameternamen in Fehlermeldungen 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; } } 28
Status Final seit August Referenzimplementierung: Hibernate Validator 6.0 29
Finale Version Teil von Java EE 8 Enthalten in GlassFish
5; Patch für WildFly Unterstützt durch Spring 5 Alles ist Open Source: Spezifikation, API, TCK und RI 30
Resourcen Spezifikation Referenzimplementierung API, Spezifikation, TCK, Website @gunnarmorling http://beanvalidation.org/2.0/spec/ github.com/hibernate/hibernate-validator/
github.com/beanvalidation/ 31
32
Ausblick Bean Validation 2.1 Constraint-API mapping.constraintDefinition( FileExists.class ) .validateType( File.class
) .with( f -> f.exists() ); Constraint-API: Lambda ConstraintMapping mapping = ...; mapping.type( Marathon.class ) .property( "numberOfHelpers", FIELD ) .constraint( new MinDef().value( 1 ) ) .property( "runners", METHOD ) .valid(); 33