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

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

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

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

Q&A

解決済

1回答

58970閲覧

th:objectでエラーが出て困っています。

mofmof

総合スコア11

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

1グッド

3クリップ

投稿2016/02/02 04:38

編集2016/02/03 05:46

###前提・実現したいこと
初心者です。
SpringBoot+Thymeleaf+Javaで入力ページを作っています。

参考サイトを見てサンプルを作ったのですが、うまく動作をしません。
・エラーメッセージについて検索してみたのですが理解ができませんでした。
・th:object="${formObj}"、th:field="*{...}"関連の部分をなくすと動作しますが、POSTの値をオブジェクトで受け取りたいのですが、どうすればいいのでしょうか。。。

###発生している問題・エラーメッセージ
ビルド時にはコンソールにエラー等は表示されませんが、画面を読み込みすると、以下のエラーが出て内部エラー500になります。
java.lang.IllegalStateException:
Neither BindingResult nor plain target object for bean name 'formObj' available as request attribute

###ソースコード

Java

1//InputSampleController.java 2// パッケージは省略 3import java.util.ArrayList; 4import java.util.List; 5 6import org.springframework.boot.autoconfigure.SpringBootApplication; 7import org.springframework.stereotype.Controller; 8import org.springframework.web.bind.annotation.ModelAttribute; 9import org.springframework.web.bind.annotation.RequestMapping; 10import org.springframework.web.bind.annotation.RequestMethod; 11import org.springframework.web.servlet.ModelAndView; 12 13import com.sample.example.dto.FormObj; 14 15@SpringBootApplication 16@Controller 17public class InputSampleController { 18 19 // ************************** 20 // テンプレートを出力 21 // ************************** 22 @RequestMapping(value = "test/formsample", method = RequestMethod.GET) 23 public ModelAndView formsample() { 24 return setFormsampleView(); 25 } 26 27 public ModelAndView setFormsampleView() { 28 ModelAndView mv = new ModelAndView("test/formsample"); 29 List<String> list = new ArrayList<String>(); 30 list.add("aaa"); 31 list.add("bbb"); 32 list.add("ccc"); 33 list.add("ddd"); 34 35 mv.addObject("list", list); 36 return mv; 37 } 38 39 // ************************** 40 // フォームからPOSTされた値を取得 41 // ************************** 42 @RequestMapping(value = "/form", method = RequestMethod.POST) 43 public ModelAndView sampleForm(@ModelAttribute("formObj") FormObj formObj) { 44 45 // 確認用 46 System.out.println("1:" + formObj.getName()); 47 System.out.println("2:" + formObj.getNumber()); 48 System.out.println("3:" + formObj.isAiueo()); 49 System.out.println("4:" + formObj.getSelectedItem()); 50 51 // ※サンプルのため特に何もしていない 52 return setFormsampleView(); 53 } 54}

Java

1// FormObj.java 2public class FormObj { 3 4 private String fullname; 5 6 private String number; 7 8 private boolean isAiueo; 9 10 private String selectedItem; 11 12// getter、setter省略 13}

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<title>入力サンプル</title> 5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 7<link href="../../static/css/bootstrap/bootstrap.min.css" 8 th:href="@{/css/bootstrap/bootstrap.min.css}" rel="stylesheet" /> 9<link href="../../static/css/bootstrap/bootstrap-theme.min.css" 10 th:href="@{/css/bootstrap/bootstrap-theme.min.css}" rel="stylesheet" /> 11<script type="text/javascript" 12 src="../../static/js/jquery-1.12.0.min.js" 13 th:src="@{/js/jquery-1.12.0.min.js}"></script> 14<script type="text/javascript" 15 src="../../static/js/bootstrap/bootstrap.min.js" 16 th:src="@{/js/bootstrap/bootstrap.min.js}"></script> 17</head> 18 19<body> 20 <div style="height: 95%"> 21 <div class="white" style="width:50%; margin:20px auto;"> 22 <form action="/form" method="post" th:object="${formObj}"> 23 <label id="caption">入力してください。</label> 24 <div class="form-group"> 25 <label for="fullname">名前</label> 26 <input type="text" class="form-control" name="fullname" th:field="*{fullname}"/> 27 </div> 28 <div class="form-group"> 29 <label for="number">番号</label> 30 <input type="text" class="form-control" name="number" th:field="*{number}"/> 31 </div> 32 <div class="radio form-group" style="margin-top: 10px" th:field="*{isAiueo}"> 33 <label> 34 <input type="radio" name="radio1" value="あいうえお" checked="checked" /> 35 &nbsp;&nbsp;あいうえお&nbsp;&nbsp;&nbsp;&nbsp; 36 </label> 37 <label> 38 <input type="radio" name="radio1" value="かきくけこ" /> 39 &nbsp;&nbsp;かきくけこ 40 </label> 41 </div> 42 <div class="form-group"> 43 <label>選択してください</label> 44 <select class="form-control" name="selectedItem" th:field="*{selectedItem}"> 45 <option value="0">---選択してください---</option> 46 <option th:each="item : ${list}" th:value="${item}" th:text="${item}"></option> 47 </select> 48 </div> 49 <div Align="center"> 50 <input class="btn btn-primary" id="orderBtn" type="submit" value="go!" /> 51 </div> 52 </form> 53 </div> 54 </div> 55</body> 56</html>

###補足情報(言語/FW/ツール等のバージョンなど)
IE11
springBootVersion = '1.3.1.RELEASE'
thymeleafVersion = '2.1.4.RELEASE'
開発環境はeclipseです。

まったく原因がわからないため、ご教示いただけたらと思います。
よろしくお願いいたします。

KatsumiTate👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

th:object="${formObj}" と書かれていると、
ビューの生成時に Model の中に "formObj" のキーでセットされている値を探しにいきます

今回の場合は、
test/formsample にアクセスされてビューを生成する時に、
ModelAttribute に FormObj がセットされていないことで該当のエラーが出ていると思われます

なので、setFormsampleView() 内に以下のコードを追加することで、
ModelAttribute に "formObj" のキーで FormObj のインスタンスをセットします

java

1public ModelAndView setFormsampleView() { 2// 省略 3 mv.addObject("list", list); 4 mv.addObject("formObj", new FormObj()); // ←これを追加しますs 5 return mv; 6}

ちなみに以下のようなメソッドをコントローラーに追加すると、
ビューの生成時に自動的に呼び出されますのでこの方法でもOKです
※これを使う場合には先ほどの修正は不要です

java

1@ModelAttribute 2FormObj setupForm() { 3 return new FormObj(); 4}

このメソッド名は setupForm でなくても任意の名前でOKです
@ModelAttribute のアノテーションと、メソッドの戻りの型から SpringBoot が自動的に判断して呼び出してくれます

投稿2016/02/04 05:41

Chanmoro

総合スコア97

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

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

mofmof

2016/02/05 07:00

>mv.addObject("formObj", new FormObj()); // ←これを追加します 上の方法でエラーが出なくなりました。 ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問