BeanValidation

2,586 views
2,275 views

Published on

バリバリー、検証は任せろー。やめてー
2013/12/28 忘年会駆動 #hogedriven

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,586
On SlideShare
0
From Embeds
0
Number of Embeds
555
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

BeanValidation

  1. 1. 2013/12/28 忘年会駆動 SQLWorld お だ
  2. 2. 自己紹介 織田 信亮(おだ しんすけ) 大阪で開発者しています SQLWorld の代表です http://odashinsuke.hatenablog.com/ Twitter:@shinsukeoda
  3. 3. Bean Validation って? Java Beans を アノテーションベースで検証する フィールド、メソッド(get~, is~) に指定 フィールドの値、メソッドの戻り値に対して検証 .NET だと System.ComponentModel.DataAnnotations が近い
  4. 4. 色んなのが標準で用意されてる @Null, @NotNull @AssertTrue, @AssertFalse @DecimalMax, @DecimalMin, @Max, @Min @Digits @Size @Pattern …
  5. 5. ネストしたオブジェクトは? 標準では検証しない @Valid 付けると、検証する class Bean { @NotNull(message="Nullだめ") // @Valid がないと、nest の中までは検証しない public Nest nest @NotNull(message="Nullだめ") @Size(min=1, message="要素は1個以上") @Valid // @Valid があるので、各要素に対しても検証を行う public List<Nest> details } class Nest { @NotNull(message="NullNG") public String name }
  6. 6. 検証エラーのメッセージ ValidationMessges.properties で書き換え可能 アノテーション指定時に直書きもOK class Bean { @NotNull(message="Nullだめ") @Size(min=1, message="{min} 以上") public String name @NotNull(message="{DateNotNull}") public Date entryDate @Digits(integer=3, fraction=1) public BigDecimal quantity }
  7. 7. 検証用のアノテーション追加 複数のアノテーションを束ねる アノテーションがまとまってスッキリ! 自前で Validator を実装することで、新しいアノテー ションを作成可能 だいたい何でも出来るはず
  8. 8. 検証を行う組み合わせを設定する 1つの Bean の中で検証を行うグループを指定する interface SearchCondition{} interface SearchResult{} class GroupSample { @NotNull(groups=SearchCondition) @Size(min=1, groups=SearchCondition) public String orderNoFrom @NotNull(groups=SearchCondition) @Size(min=1, groups=SearchCondition) public String orderNoTo @NotNull(groups=SearchResult) @Size(min=1, groups=SearchResult) public List<String> results } validator.validate(new GroupSample) .length.is(0) validator.validate(new GroupSample , SearchCondition).length.is(2) validator.validate(new GroupSample , SearchResult).length.is(1) validator.validate(new GroupSample , SearchCondition, SearchResult ).length.is(2)
  9. 9. Group の検証順序を設定する 検証を行う順序を決め、上位でエラーがあれば下位は行 わない interface First{} interface Second{} @GroupSequence(#[Default, First, Second]) interface Seq {} class BeerOrder { @NotNull @Size(min=1, groups=First) public String name @Min(value=20, groups=Second) public int age } validator.validate(new BeerOrder , Seq).length.is(1) validator.validate(new BeerOrder => [ name="" ], Seq).length.is(1) validator.validate(new BeerOrder => [ name="aaa" ], Seq).length.is(1)
  10. 10. 1つの項目で同じ検証を違う値で行う コンテキストによって検証で使う値を変えたい 同じアノテーションは複数個設定出来ない List を使って解決 interface Japan{} interface Other{} class BeerOrder2 { @Min.List(#[ @Min(value = 18, groups=Other), @Min(value = 20, groups=Japan) ]) public int age }
  11. 11. 今日の本題 JSF2 で Bean Validation
  12. 12. 動くけど… groups は 基本 Default だけっぽい 1個の form で複数ボタンの問題 このボタンの時は、検証したくない!例:行追加ボタンとか immediate=“true“ すると、値も飛んでかない このボタンの時は、この検証したくない! groups が Default 以外変更出来そうにないので、無理ー
  13. 13. 使える・・・・・・! 使えるが・・・ 使いやすいとは言っていない そのことを どうか諸君らも 思い出していただきたい つまり・・・・ 我々がその気になれば 使いやすくなるのは JavaEE10、JavaEE20 ということも 可能だろう・・・・・・・・・・というこ と・・・・!
  14. 14. というわけで、自前でやる 資料作るガッツが足りない 間に合ったらコードで紹介
  15. 15. まとめ

×