🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Spring Boot

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

Q&A

解決済

1回答

8911閲覧

spring boot で プロパティに値を入力したい。

pani-pani

総合スコア3

Spring Boot

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

0グッド

0クリップ

投稿2020/12/05 12:36

編集2020/12/05 15:05

現在、勤怠管理ができるアプリを作ろうと思っています。その中で、
spring boot で entityとして作成したクラスに値を入力したいと思っていますが、エラーが出てています。

前提・実現したいこと

発生している問題・エラーメッセージ

追記したエラーになります。 2020-12-05 23:56:38.489 ERROR 19732 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/test1.html]")] with root cause org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'day1_st1' cannot be found on null 先ほど回答を頂いた方に言及して頂いたエラーになります。 java.lang.IllegalStateException: No primary or single public constructor found for interface org.springframework.security.core.Authentication - and no default constructor found either

該当のソースコード

test1.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> border="1" width="50%" align="center"> <form th:action="@{/attendance}" th:object="${Attendance}" method="post"> <tr><!-- ここから --> <td th:text=${month}></td> <th><input type="number" name="day1_st1" th:value="*{day1_st1}"max = 24 min = 0 >:<input type=number name="day1_st2" th:value="*{day1_st2}" max = 60 min = 0 ></th><!-- ここに出金時間を入れます --> <th><input type="number" name="day1_end1" th:value="*{day1_end1}"max = 24 min = 0 >:<input type=number name="day1_end2" th:value="*{day1_end2}" max = 60 min = 0 ></th><!-- ここに退勤時間を入れます --> <th></th><!-- ここに休憩時間を入れます --> <th>勤務時間</th><!-- ここに勤務時間を入れます --> </tr><!-- ここまで --> </body> </html>

SecurityController.java

package com.example.demo.controller; import org.springframework.security.core.Authentication; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 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 org.springframework.web.servlet.ModelAndView; import com.example.demo.model.Attendance; import com.example.demo.model.SiteUser; import com.example.demo.repository.AttendanceRepository; import com.example.demo.repository.SiteUserRepository; import com.example.demo.util.Role; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Controller public class SecurityController { private final SiteUserRepository userRepository; private final BCryptPasswordEncoder passwordEncoder; private final AttendanceRepository attendanceRepository; (...) @GetMapping("/attendance") public ModelAndView createAttendance (ModelAndView mv, @ModelAttribute("attendance") Authentication SiteUser) { mv.setViewName("test1"); mv.addObject("attendance", new Attendance()); return mv; }

Attendance.java

package com.example.demo.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.validation.constraints.Size; import lombok.Getter; import lombok.Setter; @Getter @Setter @Entity public class Attendance { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Size(min = 2, max = 20) private String username; private int month; private int day1_st1; private int day1_st2; private int day1_end1; private int day1_end2; }

試したこと

コントローラのmv.addObject("attendance", new Attendance());
htmlの th:object="${Attendance}"とth:value= を削除したところ、entitiyと関係のないhtmlの出力はできたので、entitiyに問題があると考えています。

補足情報(FW/ツールのバージョンなど)

Spring Tools 4 for Eclipse
Spring Boot 2. 3. 5

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージを素直に読むと、
Authenticationクラスをnewしようと思ったけど、
デフォルトコンストラクタ(つまり引数なしのコンストラクタ)が
見つからんかったよ
という意味だと思います。

該当するのは、コントローラのcreateAttendance()メソッドです。

java

1public ModelAndView createAttendance (ModelAndView mv, 2 @ModelAttribute("attendance") Authentication SiteUser) {

この第2引数SiteUserの意図は何でしょうか?
参考サイトのコードを写し間違えたりしてませんか?

あてずっぽうですが、

java

1@GetMapping("/attendance") 2public ModelAndView createAttendance (ModelAndView mv, 3 @ModelAttribute("attendance") Attendance attendance) { 4 mv.setViewName("test1"); 5 mv.addObject("attendance", attendance); 6 return mv; 7}

とかで、良さそうな気がします。
addObject()する必要も無いかもしれません。
@ModelAttributeアノテーションを付けてるので、自動的にaddObject()されるんじゃなかったかなぁ…。

と言っておきながらナンですが、
「試したこと」に書かれてる方法でエラーが解消されたんだとすると
腑に落ちないですね。

[追記]
「追記したエラー」に関しては、
th:object="${Attendance}"th:object="${attendance}"に変えてみて下さい。
クラス名ではなく、属性名を指定すべきだと思います。

投稿2020/12/05 14:38

編集2020/12/05 15:49
gpsoft

総合スコア1323

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

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

pani-pani

2020/12/05 15:00

ご回答ありがとうございます。 ご指摘頂いた通り、@GetMapping("/attendance")で無用な記述がいくつあったようです。 ご指摘頂いた通り修正しました。ありがとうございます。 しかし、htmlの表示に関するエラーは解消されませんでした、、、
gpsoft

2020/12/05 15:51

追記されたエラーは、th:objectのバインドに失敗してるのが原因だと思います。回答を編集しておきました。
pani-pani

2020/12/05 16:03

ご回答頂いた内容で無事エラーを解消できました! 最初に回答を頂いたデフォルトコンストラクタと、th:objectへのバインドの失敗の2つが原因だったようです。 続けてのご回答ありがとうございます。とても助かりました。 夜分遅くまでご対応頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問