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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

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

Spring Boot

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

Q&A

解決済

1回答

2615閲覧

オブジェクトが参照できないエラーについて

ruuuu

総合スコア174

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

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

Spring Boot

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

0グッド

0クリップ

投稿2020/06/03 08:35

オブジェクトより、参照できないプロパティが存在し、postリクエスト時にエラーが発生してしまいました。

以下は、テンプレート部分の、showMsgController.javaです。

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title th:text="${title}">top page</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> h1{ font-size:18pt; font-weight:bold; color:gray; } body{ font-size:13pt; color:gray; margin:5px 25px;} tr { margin:5px;} th{ padding:5px; color:white; background:darkgray;} td{ padding:5px;color:black;background:#e0e0ff;} </style> </head> <body> <h1 th:text="${title}">MyMsg page</h1> <p th:text="${msg}"> <table> <form method="post" action="/msg" th:object="${formModel}"> <input type="hidden" name="id" th:value="*{id}"> <tr> <td><label for="title">タイトル</lavel></td> <td><input type-"text" name="title" th:value="*{title}"\></td> </tr> <tr> <td><label for="message">メッセージ</label></td> <td><textarea name="message" th:text="*{message}"></textarea></td> </tr> <tr> <td><label for="mydata">MYDATA_ID</label></td> <td><textarea name="mydata"></textarea></td> </tr> <tr> <td></td> <td><input type="submit"></td> </tr> </form> </table> <hr> <table> <tr><th>ID</th><th>名前</th><th>タイトル</th></tr> <tr th:each="obj : ${datalist}"> <td th:text="${obj.id}"></td>> <td th:text="${obj.mydata.name}"></td> <td th:text="${obj.title}"></td> </tr> </table> </body> </html>

以下は、MsgDataController.javaです

package com.tuyano.springboot; import java.util.List; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.tuyano.springboot.repositories.MsgDataRepository; @Controller public class MsgDataController{ @Autowired MsgDataRepository repository; @PersistenceContext EntityManager entityManager; MsgDataDaoImpl dao; @RequestMapping(value = "/msg",method = RequestMethod.GET) public ModelAndView msg(ModelAndView mav) { mav.setViewName("showMsgData"); mav.addObject("title","Sample"); mav.addObject("msg","MsgDataのサンプルです"); MsgData msgdata = new MsgData(); mav.addObject("formModel",msgdata); List<MsgData> list = (List<MsgData>)dao.getAll(); mav.addObject("datalist",list); return mav; } @RequestMapping(value = "/msg",method = RequestMethod.POST) @Transactional(readOnly=false) public ModelAndView msgform(@Valid @ModelAttribute MsgData msgdata,Errors result, ModelAndView mav) { if(result.hasErrors()) { mav.setViewName("showMsgData"); mav.addObject("title","Sample [ERROR]"); mav.addObject("msg","値を再チェックしてください!"); return mav; }else { repository.saveAndFlush(msgdata); System.out.println("test"); return new ModelAndView("redirect:/msg"); } } @PostConstruct public void init() { System.out.println("ok"); dao = new MsgDataDaoImpl(entityManager); } }

以下は、MsgData.javaです

package com.tuyano.springboot; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Entity @Table(name = "msgdata") public class MsgData { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column @NotNull private long id; @Column private String title; @Column(nullable = false) @NotEmpty private String message; @ManyToOne private MyData mydata; public MsgData() { super(); mydata = new MyData(); } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public MyData getMyData() { return mydata; } public void setMydata(MyData mydata) { this.mydata = mydata; } }

Eclipseの再生ボタンを押下後、「localhost:8080/msg」にて、アクセスし、formに適当な値を入れた後、submitボタンでpostリクエストを送信しました。

エラーの内容は以下になります。(文字数制限の為、一部抜粋)

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Jun 03 17:00:35 JST 2020
There was an unexpected error (type=Internal Server Error, status=500).
An error happened during template parsing (template: "class path resource [templates/showMsgData.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/showMsgData.html]")
Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "obj.mydata.name" (template: "showMsgData" - line 45, col 17)
org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:322)
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'mydata' cannot be found on object of type 'com.tuyano.springboot.MsgData' - maybe not public or not valid?

エラー内容から、こちらの「テンプレートHTMLのデバッグについて」項目のエラーと同様のものと思われますが、参照できない原因が分かりません。

エラーの解消の為、ご助言頂けましたら幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージにありますが

(template: "showMsgData" - line 45, col 17)

当該行:45行目の

jsp

1<td th:text="${obj.mydata.name}"></td>

objは、MsgData だと思いますが、mydataというプロパティがないようです。

'mydata' cannot be found on object of type 'com.tuyano.springboot.MsgData' - maybe not public or not valid?

で、ソースを見ると

java

1 public MyData getMyData() {

と、なっています。

jsp

1<td th:text="${obj.myData.name}"></td>

じゃないですかね。

投稿2020/06/03 09:11

momon-ga

総合スコア4820

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

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

ruuuu

2020/06/03 10:38

ご回答ありがとうございます。 「<td th:text="${obj.myData.name}"></td>」こちらの形に修正しましたら、エラーが消えました。 重ね重ね申し訳ないのですが、一点だけお聞きしたい点があります。 「getMyData() 」のメソッド名の「D」が大文字の場合、何故「obj.myData.name」こちらも大文字になるのでしょうか? メンバ変数「 private MyData mydata; 」は「mydata」な為、「mydata」になるのではないか思っていた為、どうも腑に落ちなくて...
momon-ga

2020/06/03 10:54 編集

よくある勘違いです。 フィールドの名前でなく、ゲッターの名前を使います。 私の回答でも、 > public MyData getMyData と、アクセッサーだけを抜き出しています。 ゲッターの名前からgetを抜いて最初の文字を小文字にしたものがプロパティ名となります。 つまり、obj.getMyData().getName() を呼ぶことを、obj.myData.name と書きます。 逆にいうとアクセッサーの名前だけで判断するので実際のメンバ変数はhogeとかでも動きます。 まぁ、元々privateな変数名を外部のJSPが知るわけないってのもありますが。
ruuuu

2020/06/03 11:31

ゲッターの名前を使うというのは意外でした... 勉強になりました。 詳細に教えて頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問