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
99
Ins and Outs of the Outbox Pattern
gunnarmorling
1
980
1BRC–Nerd Sniping the Java Community
gunnarmorling
0
130
Data Contracts In Practice With Debezium and Apache Flink
gunnarmorling
1
830
1BRC – Nerd Sniping the Java Community (JavaZone)
gunnarmorling
0
160
Syncing your Database To OpenSearch In Real-Time (JCON Slovenia)
gunnarmorling
0
310
1BRC – Nerd Sniping the Java Community (Keynote JCon Slovenia)
gunnarmorling
1
390
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
570
Data Contracts In Practice With Debezium and Apache Flink (Kafka Summit London)
gunnarmorling
2
950
Other Decks in Programming
See All in Programming
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
CSC307 Lecture 02
javiergs
PRO
1
780
AtCoder Conference 2025
shindannin
0
1.1k
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
4k
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
220
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
620
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
290
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6.1k
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
21
7.4k
Best-Practices-for-Cortex-Analyst-and-AI-Agent
ryotaroikeda
1
110
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
140
高速開発のためのコード整理術
sutetotanuki
1
410
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
260
Marketing to machines
jonoalderson
1
4.6k
30 Presentation Tips
portentint
PRO
1
220
So, you think you're a good person
axbom
PRO
2
1.9k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
140
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
120
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