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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

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

Thymeleaf

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

Spring Boot

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

Q&A

解決済

1回答

1251閲覧

Javaで掲示板を作製し、ユーザー登録機能を実装する際にDBに反映されない。

shinnuko

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

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

Thymeleaf

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

Spring Boot

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

0グッド

0クリップ

投稿2020/06/28 02:05

編集2020/07/05 00:29

前提・実現したいこと

現在Javaを使用して掲示板を作製しています。
トップ画面にユーザー登録画面への遷移するボタンを設置し、ユーザー登録を行う機能を実装しようとした所、登録ボタンを押した際に
以下のエラーが発生しています。

DBの内容は以下の記事を参考にしています。
https://takurog.org/bbs-lesson-2/

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

Web画面上

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sat Jun 27 15:25:04 JST 2020 There was an unexpected error (type=Internal Server Error, status=500). Exception evaluating SpringEL expression: "#fields.hasErrors('display_name')" (template: "register" - line 24, col 14)

Eclipsコンソール上での表示↓

https://github.com/shinnuko/error_log/blob/master/test

該当のソースコード

register.html

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="register.css"> <title>ユーザー登録画面はこちら</title> </head> <body> <header> <div class="header-logo"> <!-- ① --> <a href="/">フォーム画面へ</a> <a class="header-right" href="/login">ログイン</a> </div> </header> <div> <form th:action="@{/register}" action="/register" th:object="${register}" method="post"> <h1>ユーザー登録</h1> <div th:classappend="${#fields.hasErrors('display_name')}? 'has-error'"> <label for="display_name">アカウント名</label> <div> <input id="display_name" type="text" th:field="*{display_name}" name="display_name"/> <span th:if="${#fields.hasErrors('display_name')}" th:errors="*{display_name}">error!</span> </div> </div> <div th:classappend="${#fields.hasErrors('password')}? 'has-error'"> <label for="password">パスワード</label> <div> <input id="password" type="password" th:field="*{password}" name="password"/> <span th:if="${#fields.hasErrors('password')}" th:errors="*{password}">error!</span> </div> </div> <input type="submit" value="新規登録"/> </form> </div> </body> </html>

RegisterController.java

package com.example.demo.controller; import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import com.example.demo.dto.RegisterDto; @Controller public class RegisterController { @PostMapping public String create(@Valid @ModelAttribute RegisterDto registerDto, BindingResult bindingResult) { // ② if(bindingResult.hasErrors()) return "register"; // ③ registerDtosave(registerDto); return "redirect:/register"; } private void registerDtosave(@Valid RegisterDto registerDto) { // TODO 自動生成されたメソッド・スタブ } @ModelAttribute public RegisterDto setupForm() { return new RegisterDto(); } @RequestMapping(value="register") public String registerDto() { return "register"; } }

RegisterDto.java

package com.example.demo.dto; import java.io.Serializable; import lombok.Data; @Data public class RegisterDto implements Serializable { private static final long serialVersionUID = 1L; private String display_name; private String password; private String confirmPassword;//確認用パスワード public Object getDisplay_name() { // TODO 自動生成されたメソッド・スタブ return null; } public void setDisplay_name(Object display_name) { // TODO 自動生成されたメソッド・スタブ } }

RegisterprocessDto.java

package com.example.demo.dto; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import lombok.Data; @Entity @Table(name = "users") @Data public class RegisterprocessDto implements Serializable { @Id @GeneratedValue private Integer user_id; @Column(nullable=false) @NotNull // (1)対象のフィールドがnullでないことを示すjavax.validation.constraints.NotNullを付ける。 @Size(min = 1, max = 20) // (2)対象のフィールドの文字列長が指定したサイズの範囲内にあることを示す private String display_name; @Column(nullable=false, length=20) @NotNull @Size(min = 8)// 入力必須 8文字以上 confirmPasswordと同じ値であること private String password; @Column(nullable=false, updatable=false) private Date created_at; @Column(nullable=false) private Date updated_at;

RegisterReposaitory.java

package com.example.demo.dao; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.example.demo.dto.RegisterprocessDto; @Repository public interface RegisterRepository extends JpaRepository<RegisterprocessDto, Integer> { }

RegisterServise.java

package com.example.demo.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.example.demo.dao.RegisterRepository; import com.example.demo.dto.RegisterDto; import com.example.demo.dto.RegisterprocessDto; @Service @Transactional public class RegisterService { @Autowired RegisterRepository registerRepository; @Autowired PasswordEncoder passwordEncoder; public RegisterprocessDto create(RegisterprocessDto registerprocessDto , String rawPassword) { String encodedPassword = passwordEncoder.encode(rawPassword); registerprocessDto.setPassword(encodedPassword); return registerRepository.save(registerprocessDto); } @Autowired RegisterService registerService; @RequestMapping(value = "/register", method = RequestMethod.POST) String create(@Validated RegisterDto form, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "registerDto"; } RegisterDto register = new RegisterDto (); register.setDisplay_name(form.getDisplay_name()); RegisterService.create(register, form.getPassword()); return "redirect:/complete"; } private static void create(RegisterDto register, String password) { } @RequestMapping(value = "/complete", method = RequestMethod.GET) String createFinish() { return "accountcomplete"; } }

WebSecurityConfig.java

package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/","/css/**", "/datepicker/**", "/img/**"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() // 認証が必要となるURLを設定します .antMatchers("/login/").permitAll() // /loginFormは認証不要 .antMatchers("/register/").permitAll() .antMatchers("/thread/").permitAll() // /thread以下のURLも認証不要 .anyRequest().authenticated(); // それ以外はすべて認証された状態じゃなきゃダメ } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); //パスワードのハッシュ化でBCryptを使う } }

試したこと

Exception evaluating SpringEL expression: "#fields.hasErrors('display_name')" (template: "register" - line 24, col 14)

以下を参考にregister.htmlの24行目↓ をチェック。※全角のインデントが混入していなか?””等の抜けが無いか?

<div th:classappend="${#fields.hasErrors('display_name')}? 'has-error'">

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

Java SE8
Eclips Version: 2020-03 (4.15.0)
SpringBoot
Mysql8.0
登録、ログイン機能参考記事↓
https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/09/201419
https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/11/205652

参考記事からの名称変更や設定部分

ユーザデータを登録する処理用のController作成
※RegisterControllerの名称に変更して作成しています。

Formの作成
※RegisterDto.javaの名称に変更して作成しています。

RegisterDto.javaに対応するhtmlの作成
※register.htmlの名称で作成。

submitした後の登録処理 Modelの作成
※RegisterprocessDtoの名称に変更して作成しています。
リポジトリの作成
※RegisterRepositpryの名称で作成。
サービスクラスの作成 
com.example.demo配下にserviceパッケージを作製し、その中にRegisterservice..javaの名称で作製しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接解決の原因になるかわかりませんが、以下のコードを削除してください。

RegisterprocessDto.java

java

1// ... 省略 2public Object getDisplay_name() { 3 // TODO 自動生成されたメソッド・スタブ 4 return null; 5} 6 7public void setDisplay_name(Object display_name) { 8 // TODO 自動生成されたメソッド・スタブ 9 10} 11// ... 省略

当該クラスに付与されている@Dataというアノテーションはボイラープレートコードを自動生成してくれるアノテーションです。現在のソースコードだと、自動生成したsetter/getterに対し、自分で何も意味を持たないsetter/getterを定義し、上書きしている状態となっています。

投稿2020/06/29 02:25

skawamura13

総合スコア28

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

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

shinnuko

2020/07/03 23:49

th:object=の部分を以下に変更することで解決出来ました! (ModelAttribute で宣言したものと異なるものが入っていたのが原因だったようです。) エラー表示の部分と異なる点が要因でエラーになる事もあるのですね。今後注意して確認して行こうと思います。 <form th:action="@{/register}" action="/register" th:object="${registerDto}" method="post">
shinnuko

2020/07/03 23:51

skawamura13さんのアドバイスも要因の一部だったと思われます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問