Submit Search
Javaでのバリデーション 〜Bean Validation篇〜
7 likes
19,747 views
eiryu
2014/12/04 Validation Night at LINE株式会社
Technology
Read more
1 of 31
Download now
Downloaded 16 times
1
2
3
4
5
6
7
8
9
10
11
Most read
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Most read
27
Most read
28
29
30
31
More Related Content
PDF
Javaのログ出力: 道具と考え方
Taku Miyakawa
PDF
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
PDF
Spring Day 2016 - Web API アクセス制御の最適解
都元ダイスケ Miyamoto
PDF
SpringBootTest入門
Yahoo!デベロッパーネットワーク
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
PDF
イミュータブルデータモデルの極意
Yoshitaka Kawashima
Javaのログ出力: 道具と考え方
Taku Miyakawa
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
Spring Day 2016 - Web API アクセス制御の最適解
都元ダイスケ Miyamoto
SpringBootTest入門
Yahoo!デベロッパーネットワーク
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
イミュータブルデータモデルの極意
Yoshitaka Kawashima
What's hot
(20)
PDF
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
PPTX
MicrometerとPrometheusによる LINEファミリーアプリのモニタリング
LINE Corporation
PDF
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
PDF
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
techgamecollege
PPTX
RLSを用いたマルチテナント実装 for Django
Takayuki Shimizukawa
PDF
さいきんの InnoDB Adaptive Flushing (仮)
Takanori Sejima
PDF
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
PDF
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
PPTX
SQLチューニング入門 入門編
Miki Shimogai
PDF
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
PDF
アクセスプラン(実行計画)の読み方入門
Akira Shimosako
PDF
Spring bootでweb バリデート編
なべ
PDF
SQLアンチパターン - ジェイウォーク
ke-m kamekoopa
PPTX
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
PDF
実践 NestJS
Ayumi Goto
PPTX
ReactでuseEffect()を減らしたい話
iPride Co., Ltd.
PDF
クラウド時代だからSpring-Retryフレームワーク
Y Watanabe
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
PDF
トランザクションの並行処理制御
Takashi Hoshino
PDF
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
MicrometerとPrometheusによる LINEファミリーアプリのモニタリング
LINE Corporation
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
techgamecollege
RLSを用いたマルチテナント実装 for Django
Takayuki Shimizukawa
さいきんの InnoDB Adaptive Flushing (仮)
Takanori Sejima
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
SQLチューニング入門 入門編
Miki Shimogai
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
アクセスプラン(実行計画)の読み方入門
Akira Shimosako
Spring bootでweb バリデート編
なべ
SQLアンチパターン - ジェイウォーク
ke-m kamekoopa
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
実践 NestJS
Ayumi Goto
ReactでuseEffect()を減らしたい話
iPride Co., Ltd.
クラウド時代だからSpring-Retryフレームワーク
Y Watanabe
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
トランザクションの並行処理制御
Takashi Hoshino
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
Ad
More from eiryu
(8)
PDF
Introducing thymeleaf
eiryu
PDF
Ninja framework使ってみた
eiryu
PDF
JMeter小話
eiryu
PDF
Thymeleafのすすめ
eiryu
PPT
最近のJavaでの開発について
eiryu
PPT
Thymeleafでハマったこと
eiryu
PPT
TwFavView
eiryu
PDF
Spring小話
eiryu
Introducing thymeleaf
eiryu
Ninja framework使ってみた
eiryu
JMeter小話
eiryu
Thymeleafのすすめ
eiryu
最近のJavaでの開発について
eiryu
Thymeleafでハマったこと
eiryu
TwFavView
eiryu
Spring小話
eiryu
Ad
Javaでのバリデーション 〜Bean Validation篇〜
1.
Javaでのバリデーション 〜Bean Validation篇〜 2014/12/04 Validation
Night at Line @eiryu
2.
なにをやっているのか ● Twitter @eiryu ○
http://eiryu.com ● 仕事 ○ インフラ・情シス ● バッググラウンド ○ Webアプリケーションエンジニア ■ Java ● Spring Framework ■ Groovy ■ JavaScript ■ PostgreSQL
3.
なにをやっているのか
4.
なぜやるのか ● 人間なのでヒューマンエラーは付きもの ● バリデーションされてなかったことによる壊れた ユーザーデータはマーケティングにも生かせな い ○
男性で妊娠している等 ● Webアプリケーションの場合、最悪ユーザー情 報が漏洩したり、操作されたりする
5.
どうやってやっているのか ● Bean Validationを利用 ●
Webアプリケーションのコントローラでユーザー 入力をチェック ● 単体テスト(JUnit)で想定しうる不正な入力のテ スト ※フレームワークはSpring Bootを利用
6.
こんなことやります Bean Validationで(ry
7.
以上、Wantedly四段活用でした!
8.
Bean Validationとは “JavaBeansのバリデーション(値の検証)のため のメタデータモデルとAPIを定めたJavaのソフト ウェアフレームワーク” Wikipedia http://beanvalidation.org/
9.
Bean Validationの沿革 2009 Bean
Validation 1.0(JSR 303) 2013 Bean Validation 1.1(JSR 349) JSRとは Java Specification Requestsの略。日本語だと、 Java仕様要望。個人的にはJava版のRFCと捉え ている。
10.
何がうれしいのか ● あらかじめよく使う制約(チェック)が用意されて いる ○ Constraintsと呼ぶ ●
ユーザーの入力を受け取るJavaBeans (POJO)にアノテーションで記載するため、 POJOに対してテストが書ける ○ コントローラのメソッド内でチェックしているとリクエストを エミュレートするテストを書かなければならない
11.
Constraintsの例 ● @NotNull ○ nullでないこと ●
@Pattern ○ 指定した正規表現にマッチすること ● @Size ○ 文字列等のサイズが指定した範囲であること ● @AssertTrue ○ trueであること ● @Future ○ JVMの現在日時より未来であること packageはjavax.validation.constraints
12.
ここで一般的なバリデーションの話に戻る と。。
13.
バリデーションの種類 ● 単項目チェック ● 相関チェック
14.
単項目チェック ● 1つの項目に対するチェック ● 例 ○
ユーザー登録で名前の入力は必須だが、入力されてい るか?
15.
相関チェック ● 2つ以上の項目にまたがるチェック ● 例 ○
性別で男性を選択しているのに、妊婦の項目にチェック していないか?
16.
コード例
17.
コード例 以下のようなフィールドを持つUserFormがあると する ● 名前(name) ● 性別(sex) ●
妊娠しているか(pregnant)
18.
コード例 単項目チェック @NotNull(message = "性別がぬるぽ") private
Sex sex;
19.
コード例 単項目チェック ● フィールドまたはそのgetterにConstraintsを付 与
20.
コード例 相関チェック @AssertTrue(message = "男性なのに妊娠してるって言ってる。。") public
boolean isValidPregnant() { // 性別が入力されていない時は、そちらで引っかかるのでバリデーショ ンしない if (sex == null) { return true; } // 妊娠していると選択している人が女性であることをチェック if (pregnant) { return Sex.FEMALE == sex; } return true; }
21.
コード例 相関チェック ● メソッドを定義してそこにアノテーションを付与 ● 個人的には@AssertTrueのみ利用すれば良い と思う ○
Bean ValidationのValidatorのお作法的に、isValidでバ リデーションOKならばtrueを返すようになっている。その 流れに沿った方が分かりやすい
22.
コード例 単体テスト (特定プロパティのみのバリデーション) private Validator validator
= Validation.buildDefaultValidatorFactory().getValidator(); @Test public void validateName_正常系() { UserForm userForm = new UserForm(); userForm.setName("eiryu"); Set<ConstraintViolation<UserForm>> violations = validator.validateProperty(userForm, "name"); LOGGER.info("violations: " + violations); assertThat(violations, hasSize(0)); }
23.
コード例 単体テスト (JavaBeans全体のバリデーション) private Validator validator
= Validation.buildDefaultValidatorFactory().getValidator(); @Test public void validate_正常系() { UserForm userForm = new UserForm(); userForm.setName("eiryu"); userForm.setSex(Sex.MALE); userForm.setPregnant(false); Set<ConstraintViolation<UserForm>> violations = validator.validate(userForm); LOGGER.info("violations: " + violations); assertThat(violations, hasSize(0)); }
24.
コード例 Webアプリケーション (Spring Bootのコントローラ) @RequestMapping("registor") public String
registor( @Valid UserForm userForm, BindingResult bindingResult) { if (bindingResult.hasErrors()) { LOGGER.warn("bindingResult: " + bindingResult); return "index"; } // some process.. return "redirect:/complete"; }
25.
気にすべきポイント・TIPS
26.
気にすべきポイント・TIPS (バリデーションの順番) ● 普通に使うと、バリデーションが行われる順番はラ ンダム ○ Webアプリケーションでメッセージを上部に列挙するよう な場合に注意 ○
相関チェックでは、関係するフィールドが単項目チェック 済みでないことに注意して実装する必要がある
27.
気にすべきポイント・TIPS (バリデーションの順番) ● Group、 Group
sequence という仕組みを使うとバ リデーションの順番を制御することが出来る ○ JSRのSpecの例では、バリデーションで非常に重い処 理があって、それは他のバリデーションがOKだった時の み実行する、というもの ○ 他に想定出来るのは、同時に2つ以上エラーになってい るのに1つずつエラーメッセージ出すとか?
28.
気にすべきポイント・TIPS (メッセージ) メッセージはプロパティファイルに外だし可能。ロケールごとの ファイルを用意すればi18n対応も可能 ● ValidationMessages.properties ● ValidationMessages_ja_JP.properties プロパティファイルのエンコーディングはISO-8859-1で作成す ること(昭和か!) ●
IDEの自動変換かnative2ascii(昭和か!)で頑張りましょう @NotNull(message = "{NotNull.sex}") private Sex sex;
29.
気にすべきポイント・TIPS (その他) ● JavaBeansの中にJavaBeansがあるような ケースでは、そのフィールドに対して@Validアノ テーションを付与すれば再帰的にバリデーショ ンされる public class
UserForm { ... @Valid private Address address; ... }
30.
ご清聴ありがとうございました
31.
参考文献 ● http://beanvalidation.org/ ● http://yamkazu.hatenablog. com/entry/20110206/1296985545
Download