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

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

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

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

0回答

1259閲覧

springでhasErrorsメソッドを使えない

kachikata

総合スコア9

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/22 16:08

springでhasErrorsメソッドを使ったらエラーが出ました
htmlでhasErrorsメソッドを使うには何かimportしなくていけないのでしょうか
それともmodelのほうに問題があるのでしょうか。
そもそも環境が設定が間違っている可能性が高いのでしょうか。
参考に一番高い可能性を教えてくください。

エラーコード
org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method hasErrors(java.lang.String) cannot be found on type org.thymeleaf.spring5.expression.SPELContextMapWrapper

ソースコード

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"></meta> <!-- Bootstrapの設定 --> <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}"rel="stylesheet"></link> <script th:src="@{/webjars/bootstrap/3.3.7-1/css/bootsrap.min.js}"></script> <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> <title>SignUp</title> </head> <body> <div class="col-sm-5"> <div class="page-header"> <h1>ユーザー登録画面</h1> </div> <form method="post" th:action="@{/signup}" th:object="${signupForm}"> <table class="table table-bordered table-hover"> <!-- ユーザーIDの入力エリア --> <tr> <th class="active col-sm-3">ユーザID</th> <td> <div class="form-group" th:classappend="${#fields.hasErrors('userId')}?'has-error'"> <input type="text" class="form-control" th:field="*{userId}"/> <span class="text-danger" th:if="${#fields.hasErrors('userId')}" th:errors="*{userId}"> userId error </span> </div> </td> </tr> <!-- パスワードの入力エリア--> <tr> <th class="active">パスワード</th> <td> <div class="form-group" th:classappend="${#fields.hasErrors('password')}?'has-error'"> <input type="text" class="form-control" th:field="*{password}"/> <span class="text-danger" th:if="${#fields.hasErrors('password')}" th:errors="*{password}"> password error</span> </div> </td> </tr> <!-- ユーザー名の入力エリア--> <tr> <th class="active">ユーザー名</th> <td> <div class="form-group" th:classappend="${#fields.hasErrors('userName')}?'has-error'"> <input type="text" class="form-control"th:field="*{userName}"/> <span class="text-danger" th:if="${fields/hasErrors('userName')}" th:errors="*{userName}"> userName error</span> </div> </td> </tr> <!-- 誕生日の入力エリア--> <tr> <th class="active">誕生日</th> <td> <div class="form-group" th:classappend="${#fields.hasErrors('birthday')}?'has-error'"> <input type="text" class="form-control" placeholder="yyyy/MM/dd" th:field="*{birthday}"/> <span class="textt-danger" th:if="${#fields.hasErrors('birthday')}" th:errors="*{birthday}"> birthday error</span> </div> </td> </tr> <!-- 年齢の入力エリア--> <tr> <th class="active">年齢</th> <td> <div class="form-group" th:classappend="${#fields/hasErrors('age')} ? 'has-error'"> <input type="text" class="form-control" th:field="*{age}"/> <span class="text-danger" th:if="${#fields.hasErrors('age')}" th:errors="*{age}"> age error</span> </div> </td> </tr> <!-- 結婚ステータスの入力エリア--> <tr> <th class="active">結婚</th> <td> <div class="form-group"> <!-- ポイント:ラジオボタンの実践--> <div th:each="item:${radioMarriage}"> <input type="radio" name="radioMarrige" th:text="${item.key}" th:value="${item.value}" th:field="*{marriage}"> </div> <span class="text-danger" th:if="${#fields.hasErrors('marriage')}" th:errors="*{marriage}"> marriage error</span> </div> </td> </tr> </table> <!-- エラーメッセージの一覧表示 --> <ul> <li th:each="error:${#fields.detailedErrors()}"> <span th:text="${error.message}">Error message</span> </li> </ul> <!-- ユーザー登録ボタン--> <button class="btn btn-primary" type="submit">ユーザー登録</button> </form> </div> </body> </html>

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

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

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

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

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

m.ts10806

2020/05/22 20:29

コードやエラーはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 あとthymeleafのコードだけじゃなく、Java側のコードもなるべく一通りご提示ください。
退会済みユーザー

退会済みユーザー

2020/05/22 23:19

なんとなく適当に予測 自前で thymeleafの設定をしている場合、必要な設定が抜けてると思います。 公式の設定で しましょう。 オートコンフィグレしてれば全部設定してくれるわけで自前で設定する必要が皆無
kachikata

2020/05/23 04:04

やはりthymeleafの設定に原因がありそうですね。 一応関連コードを上げておきます。 ・入力フォームのmodel package com.example.demo.login.domain.model; import java.util.Date; import javax.validation.constraints.AssertFalse; import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; import lombok.Data; @Data public class SignupForm { //必須入力、メールアドレス形式 @NotBlank(message="{require_check}") @Email(message="{email_check") private String userId;//ユーザーID //必須入力、長さ4から100桁まで、半角英数字のみ @NotBlank(message="{require_check}") @Length(min=4,max=100,message="{length_check}") @Pattern(regexp="^[a-zA-Z0-9]+$",message="{pattern_check}") private String password;//パスワード //必須入力 @NotBlank(message="{require_check}") private String userName;//ユーザー名 //必須入力 @NotNull(message="{require_check}") @DateTimeFormat(pattern="yyyy/MM/dd") private Date birthday;//誕生日 //値が20から100まで @Min(value=20,message="{min_check}") @Max(value=100,message="{max_check}") private int age;//年齢 //falseのみ可能 @AssertFalse(message="{false_check}") private boolean marriage;//結婚ステータス } 入力フォームのController package com.example.demo.login.controller; import java.util.LinkedHashMap; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import com.example.demo.login.domain.model.SignupForm; @Controller public class SignupController { //ポイント1:ラジオボタンの実装 private Map<String,String>radioMarriage; //ラジオボタンの初期化メソッド private Map<String,String>initRadioMarrige(){ Map<String,String>radio = new LinkedHashMap<>(); //既婚、未婚をMapに格納 radio.put("既婚", "true"); radio.put("未婚", "false"); return radio; } //ユーザー登録画面のGET用コントローラー @GetMapping("/signup") public String getSignUp(@ModelAttribute SignupForm form,Model model) { //ラジオボタンの初期化メソッド呼び出し radioMarriage = initRadioMarrige(); //ラジオボタン用のMapをModelに登録 model.addAttribute("radioMarriage",radioMarriage); //signup.htmlに画面遷移 return "login/signup"; } //ユーザー登録画面のPOST用コントローラー @PostMapping("/signup") public String postSignUp(@ModelAttribute @Validated SignupForm form,BindingResult bindingResult,Model model) { //ポイント2:リダイレクト //login.htmlにリダイレクト if(bindingResult.hasErrors()) { return getSignUp(form,model); } //formの中身をコンソールに出して確認します System.out.println(form); //login.htmlにリダイレクト return "redirect:login"; } } エラーメッセージpropaties #フィールド名 userId=ユーザーID password=パスワード userName=ユーザー名 birthday=誕生日 age=年齢 #必須入力チェック require_check={0}は必須入力です #メールアドレス形式チェック email_check={0}はメールアドレス形式で入力してください #入力文字数チェック length_check={0}は、{2}桁以上、{1}桁以下の桁数で入力してください #フォーマットチェック pattern_check={0}は半角英数字を入力してください #下限値チェック min_check={0}は{1}以上を入力してください #上限値チェック max_check={0}は{1}以下を入力してください #ステータスチェック false_check=falseの場合のみ登録できます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問