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
Ins and Outs of the Outbox Pattern
gunnarmorling
1
330
1BRC–Nerd Sniping the Java Community
gunnarmorling
0
110
Data Contracts In Practice With Debezium and Apache Flink
gunnarmorling
1
710
1BRC – Nerd Sniping the Java Community (JavaZone)
gunnarmorling
0
140
Syncing your Database To OpenSearch In Real-Time (JCON Slovenia)
gunnarmorling
0
250
1BRC – Nerd Sniping the Java Community (Keynote JCon Slovenia)
gunnarmorling
1
380
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
530
Data Contracts In Practice With Debezium and Apache Flink (Kafka Summit London)
gunnarmorling
2
900
From Postgres to OpenSearch in No Time
gunnarmorling
1
1.4k
Other Decks in Programming
See All in Programming
Introduction to Git & GitHub
latte72
0
110
GitHub Copilotの全体像と活用のヒント AI駆動開発の最初の一歩
74th
7
2.9k
管你要 trace 什麼、bpftrace 用下去就對了 — COSCUP 2025
shunghsiyu
0
420
State of CSS 2025
benjaminkott
1
110
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.1k
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
730
A Gopher's Guide to Vibe Coding
danicat
0
150
tool ディレクティブを導入してみた感想
sgash708
1
120
ライブ配信サービスの インフラのジレンマ -マルチクラウドに至ったワケ-
mirrativ
1
230
Android 15以上でPDFのテキスト検索を爆速開発!
tonionagauzzi
0
200
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
220
コーディングは技術者(エンジニア)の嗜みでして / Learning the System Development Mindset from Rock Lady
mackey0225
2
490
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Optimizing for Happiness
mojombo
379
70k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Automating Front-end Workflow
addyosmani
1370
200k
Into the Great Unknown - MozCon
thekraken
40
2k
The Invisible Side of Design
smashingmag
301
51k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Producing Creativity
orderedlist
PRO
347
40k
Writing Fast Ruby
sferik
628
62k
The Language of Interfaces
destraynor
159
25k
What's in a price? How to price your products and services
michaelherold
246
12k
Navigating Team Friction
lara
188
15k
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