beanvalidation
DESCRIPTION
バリバリー、検証は任せろー。やめてー 2013/12/28 忘年会駆動 #hogedrivenTRANSCRIPT
2013/12/28 忘年会駆動SQLWorld お だ
自己紹介
織田 信亮 ( おだ しんすけ )大阪で開発者していますSQLWorld の代表です
http://odashinsuke.hatenablog.com/Twitter:@shinsukeoda
Bean Validation って?
Java Beans を アノテーションベースで検証するフィールド、メソッド (get ~ , is ~ ) に指定フィールドの値、メソッドの戻り値に対して検証.NET だと System.ComponentModel.DataAnnotations が近い
色んなのが標準で用意されてる
@Null, @NotNull@AssertTrue, @AssertFalse@DecimalMax, @DecimalMin, @Max, @Min@Digits@Size@Pattern…
ネストしたオブジェクトは?
標準では検証しない@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}
検証エラーのメッセージ
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}
検証用のアノテーション追加
複数のアノテーションを束ねるアノテーションがまとまってスッキリ!
自前で Validator を実装することで、新しいアノテーションを作成可能
だいたい何でも出来るはず
検証を行う組み合わせを設定する
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)
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)
1 つの項目で同じ検証を違う値で行う
コンテキストによって検証で使う値を変えたい同じアノテーションは複数個設定出来ないList を使って解決
interface Japan{}interface Other{}class BeerOrder2 { @Min.List(#[ @Min(value = 18, groups=Other), @Min(value = 20, groups=Japan) ]) public int age}
今日の本題
JSF2 で Bean Validation
動くけど…
groups は 基本 Default だけっぽい1 個の form で複数ボタンの問題
このボタンの時は、検証したくない!例:行追加ボタンとかimmediate=“true“ すると、値も飛んでかない
このボタンの時は、この検証したくない!groups が Default 以外変更出来そうにないので、無理ー
使える・・・・・・!使えるが・・・使いやすいとは言っていない
そのことをどうか諸君らも思い出していただきたい
つまり・・・・我々がその気になれば使いやすくなるのはJavaEE10、 JavaEE20 ということも可能だろう・・・・・・・・・・ということ・・・・!
というわけで、自前でやる
資料作るガッツが足りない間に合ったらコードで紹介
まとめ