Submit Search
Upload
Javaでのバリデーション 〜Bean Validation篇〜
•
7 likes
•
19,379 views
eiryu
Follow
2014/12/04 Validation Night at LINE株式会社
Read less
Read more
Technology
Report
Share
Report
Share
1 of 31
Download now
Download to read offline
Recommended
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
Spring bootでweb バリデート編
Spring bootでweb バリデート編
なべ
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
Native Memory Tracking
Native Memory Tracking
Takahiro YAMADA
Recommended
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
Spring bootでweb バリデート編
Spring bootでweb バリデート編
なべ
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
Native Memory Tracking
Native Memory Tracking
Takahiro YAMADA
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
Amazon Web Services Japan
Mavenの真実とウソ
Mavenの真実とウソ
Yoshitaka Kawashima
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化
Satoshi Akama
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
Insight Technology, Inc.
スキトラ Spring + mybatis
スキトラ Spring + mybatis
小川 昌吾
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
Masatoshi Tada
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma
Toshihiro Nakamura
JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法
Chihiro Ito
JSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方について
Aya Ebata
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
Yuji Otani
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Preferred Networks
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介
Yahoo!デベロッパーネットワーク
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
Introducing thymeleaf
Introducing thymeleaf
eiryu
Ninja framework使ってみた
Ninja framework使ってみた
eiryu
More Related Content
What's hot
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
Amazon Web Services Japan
Mavenの真実とウソ
Mavenの真実とウソ
Yoshitaka Kawashima
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化
Satoshi Akama
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
Insight Technology, Inc.
スキトラ Spring + mybatis
スキトラ Spring + mybatis
小川 昌吾
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
Masatoshi Tada
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma
Toshihiro Nakamura
JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法
Chihiro Ito
JSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方について
Aya Ebata
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
Yuji Otani
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Preferred Networks
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介
Yahoo!デベロッパーネットワーク
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
What's hot
(20)
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
Mavenの真実とウソ
Mavenの真実とウソ
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
スキトラ Spring + mybatis
スキトラ Spring + mybatis
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma
JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法
JSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方について
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
More from eiryu
Introducing thymeleaf
Introducing thymeleaf
eiryu
Ninja framework使ってみた
Ninja framework使ってみた
eiryu
JMeter小話
JMeter小話
eiryu
Thymeleafのすすめ
Thymeleafのすすめ
eiryu
最近のJavaでの開発について
最近のJavaでの開発について
eiryu
Thymeleafでハマったこと
Thymeleafでハマったこと
eiryu
TwFavView
TwFavView
eiryu
Spring小話
Spring小話
eiryu
More from eiryu
(8)
Introducing thymeleaf
Introducing thymeleaf
Ninja framework使ってみた
Ninja framework使ってみた
JMeter小話
JMeter小話
Thymeleafのすすめ
Thymeleafのすすめ
最近のJavaでの開発について
最近のJavaでの開発について
Thymeleafでハマったこと
Thymeleafでハマったこと
TwFavView
TwFavView
Spring小話
Spring小話
Recently uploaded
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
Recently uploaded
(12)
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
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 now