beanvalidation

16
2013/12/28 忘忘忘忘忘 SQLWorld 忘 忘

Upload: oda-shinsuke

Post on 28-May-2015

1.573 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

Page 1: BeanValidation

2013/12/28 忘年会駆動SQLWorld お だ

Page 2: BeanValidation

自己紹介

織田 信亮 ( おだ しんすけ )大阪で開発者していますSQLWorld の代表です

http://odashinsuke.hatenablog.com/Twitter:@shinsukeoda

Page 3: BeanValidation

Bean Validation って?

Java Beans を アノテーションベースで検証するフィールド、メソッド (get ~ , is ~ ) に指定フィールドの値、メソッドの戻り値に対して検証.NET だと System.ComponentModel.DataAnnotations が近い

Page 4: BeanValidation

色んなのが標準で用意されてる

@Null, @NotNull@AssertTrue, @AssertFalse@DecimalMax, @DecimalMin, @Max, @Min@Digits@Size@Pattern…

Page 5: BeanValidation

ネストしたオブジェクトは?

標準では検証しない@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}

Page 6: BeanValidation

検証エラーのメッセージ

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}

Page 7: BeanValidation

検証用のアノテーション追加

複数のアノテーションを束ねるアノテーションがまとまってスッキリ!

自前で Validator を実装することで、新しいアノテーションを作成可能

だいたい何でも出来るはず

Page 8: BeanValidation

検証を行う組み合わせを設定する

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)

Page 9: BeanValidation

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)

Page 10: BeanValidation

1 つの項目で同じ検証を違う値で行う

コンテキストによって検証で使う値を変えたい同じアノテーションは複数個設定出来ないList を使って解決

interface Japan{}interface Other{}class BeerOrder2 { @Min.List(#[ @Min(value = 18, groups=Other), @Min(value = 20, groups=Japan) ]) public int age}

Page 11: BeanValidation

今日の本題

JSF2 で Bean Validation

Page 12: BeanValidation
Page 13: BeanValidation

動くけど…

groups は 基本 Default だけっぽい1 個の form で複数ボタンの問題

このボタンの時は、検証したくない!例:行追加ボタンとかimmediate=“true“ すると、値も飛んでかない

このボタンの時は、この検証したくない!groups が Default 以外変更出来そうにないので、無理ー

Page 14: BeanValidation

使える・・・・・・!使えるが・・・使いやすいとは言っていない

そのことをどうか諸君らも思い出していただきたい

つまり・・・・我々がその気になれば使いやすくなるのはJavaEE10、 JavaEE20 ということも可能だろう・・・・・・・・・・ということ・・・・!

Page 15: BeanValidation

というわけで、自前でやる

資料作るガッツが足りない間に合ったらコードで紹介

Page 16: BeanValidation

まとめ