質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

7564閲覧

spring boot のフォーム用アノテーションにメソッド名を指定をする方法

yukidaruman

総合スコア13

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2016/01/21 03:12

現在、spring boot 1.2.1 にて入力画面を作成しているのですが、
1画面内に、検索ボタンと登録ボタンがあり、いずれを押下しても
アノテーションでのチェックを行いたいです。

ただ、1つのフォームを使用しているため、いずれかのアクションを起こすと
検索用の項目と、登録用の項目のどちらもアノテーションチェックの結果が
BindingResultに格納されてきてしまう状況です。

フォームでのアノテーションを使用する際に「どの処理でのみ使用する」という指定は
可能なのでしょうか?
(SAStrutsの検証用アノテーションでいうところのtarget要素のようなもの)
調べてみましたが、そのような要素を見つけることができませんでした。

もし存在しないなら、フォームを別にするか、コントローラ側でチェックするしか手はないのでしょうか。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Validation の groups属性を使うと質問の内容と同等のことができるかと思います

以下のサンプルコードのようにすると、
1つのフォームクラスでもクリックされたボタンに応じてチェック処理を切り替えることができます

こんな感じで1つのフォーム内に複数ボタンがあるとします

html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"> 3<body> 4<form th:action="@{/test}" th:object="${testForm}" method="post"> 5 <input type="text" th:field="*{param1}" name="param1" /> 6 <input type="text" th:field="*{param2}" name="param2" /> 7 <input type="text" th:field="*{param3}" name="param3" /> 8 <button id="action1" name='action1' value='action1' type="submit" >Action1</button> 9 <button id="action2" name='action2' value='action2' type="submit" >Action2</button> 10 <button id="action2" name='action3' value='action3' type="submit" >Action3</button> 11</form> 12</body> 13</html> 14

まず、Form クラス内に実施するバリデーションを区別するためのインターフェースを用意します
-ValidationAction1 ※action1 のボタンで実施するバリデーションのグループ
-ValidationAction2 ※action2 のボタンで実施するバリデーションのグループ
-ValidationAll ※ValidationAction1、ValidationAction2の両方を行うグループ
※このインターフェースはForm クラスの外で定義しても同じです

そして、各バリデーションのアノテーションの引数 groups で、バリデーションのグループを指定します

java

1public class TestForm implements Serializable { 2 private static final long serialVersionUID = 1L; 3 4 public interface ValidationAction1 {} 5 6 public interface ValidationAction2 {} 7 8 @GroupSequence({ValidationAction1.class, ValidationAction2.class}) 9 public interface ValidationAll {} 10 11 @NotBlank(groups = {ValidationAction1.class}) 12 private String param1; 13 14 @NotBlank(groups = {ValidationAction2.class}) 15 private String param2; 16 17 @NotBlank 18 private String param3; 19 20 21// 以下、getter & setter 22 23}

コントローラー側ではどのグループのバリデーションを実行したフォームを受け取るかを指定します

例えば以下のように、クリックされたボタンに対応するアクションをそれぞれ用意します
そして、各アクションで受け取る Form オブジェクトに対して、@Validated の引数に実施するバリデーションのグループを指定します

そうすると、@Validatedでしていしたグループのバリデーションだけが実行されます
groups を指定しなかったバリデーションは Default に属するので注意してください
Default.class を付けないと groups なしのバリデーションは無視されます

java

1 @RequestMapping(method = RequestMethod.POST, value = "", params = {"action1"}) 2 public String action1(@Validated({TestForm.ValidationAction1.class, Default.class}) TestForm testForm, Errors errors) 3 throws Throwable { 4 // action1 の処理 5 return "test"; 6 } 7 8 @RequestMapping(method = RequestMethod.POST, value = "", params = {"action2"}) 9 public String action2(@Validated({TestForm.ValidationAction2.class, Default.class}) TestForm testForm, Errors errors) 10 throws Throwable { 11 // action2 の処理 12 return "test"; 13 } 14 15 @RequestMapping(method = RequestMethod.POST, value = "", params = {"action3"}) 16 public String action3(@Validated({TestForm.ValidationAll.class, Default.class}) TestForm testForm, Errors errors) 17 throws Throwable { 18 // action3 の処理 19 return "test"; 20 }

投稿2016/03/18 10:01

Chanmoro

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukidaruman

2016/04/06 07:08

Chanmoroさん、回答ありがとうございます! 気付くのが遅れました。すいません。 丁寧に注意点も書いていただき、サンプルソースまであったので ばっちり問題なく理解できました! 自分の環境でも同じようにコーディングし、うまくいくことを確認しました。 springBootは日本語の本も少なく、ネットも英語が多くてうまく答えを見つけることができずにとても困っていました。 本当に助かりました。ありがとうございました! (関係ないですがspringBootってデフォルトのアノテーション少ないですね・・・)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問