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

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

ただいまの
回答率

88.82%

ネストしたフォームクラスのバリデーションエラーメッセージのカスタマイズ方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,273

hikage

score 24

Springでネストしたフォームクラスでバリデーションをかけた際のエラーメッセージの
カスタマイズ方法についてアドバイス頂きたいです。

ネストされた子フォームでは、それぞれ商品名と数量を受けとり、
数量について値が1以上というバリデーションを@Maxでかけています。
そのエラーメッセージを同じアノテーション内のmessage属性で一律的に
「数量の最大は10です」としているのですが、これをビューの表記に合わせて
「商品2の数量の最大は10です」とか「商品3の数量の最大は10です」としたいです。

その方法について何かアドバイスでもご教授頂きたいです。

試してみたことは、
テンプレートにインデックス番号を仕込んでパラメータとして渡して、
フォームクラス内で文字列結合しようとしたら、message属性からは定数しか参照できないと
コンパイルで言われてしまいました。

【親フォーム】

@Data
public class RegisterForm {

    //省略

    //商品(ネストしたフォームクラス)
    @Valid
    private List<RegisterChildForm> registerChildForm;

}


【子フォーム】

@Data
public class RegisterChildForm {

    // 商品名
    private String product_name;

    // 数量
    @Max(value=10,message="数量の最大は10です")
    private int product_amount;


}


【Controller】

@RequestMapping(value="/sample", method = RequestMethod.POST)
public String Register(
    @Validated @ModelAttribute RegisterForm registerForm,
    BindingResult bindingResult,
    Model model,
    RedirectAttributes redirectAttributes
) {

    if (bindingResult.hasErrors()) {
        // 入力ページへ戻す
        return "register"
    }

    return "redirect:/register";
}

【View】

<form id="" th:action="@{/sample}" method="POST" th:object="${registerForm}">

    <!-- 省略 -->

    <h2>注文内容</h2>
    <div class="" th:each="idx,stat : ${#numbers.sequence(0, 4)}">

    <span th:text="'注文' + ${stat.count}"></span><br />
    商品名<input type="text" th:field="*{registerChildForm[__${idx}__].product_name}" />

    数量<input type="text" th:field="*{registerChildForm[__${idx}__].product_amount}" />
    <span th:if="${#fields.hasErrors('registerChildForm[__${idx}__].product_amount')}" th:errors="*{registerChildForm[__${idx}__].product_amount}"></span>

    <button type="submit">送信</button>
</form>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

例えばこんな感じ?

<span th:if="${#fields.hasErrors('registerChildForm[__${idx}__].product_amount')}" >
<span th:text="*{registerChildForm[__${idx}__].product_name}"></span><span th:errors="*{registerChildForm[__${idx}__].product_amount}"></span>
</span>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/04 21:50

    コメントありがとうございます。例えば、その結合をフォームクラスでできたりするのでしょうか?説明が足ら恐縮ですが、テンプレート側では、色々いじらずあくまでモデルとかクラスで完結できる方法を今回は模索したいと思っていました。

    キャンセル

  • 2018/03/04 23:21

    カスタムバリデータの作成するしかなかったとおもう

    キャンセル

  • 2018/03/05 09:14 編集

    カスタムバリデータですか。上にあげたクラスだけでは難しい感じですね。
    教えて頂きありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る