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

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

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

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

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

Spring Boot

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

Q&A

解決済

1回答

1593閲覧

spring bootで新規登録機能を作成したい。

hhhhhhggggg

総合スコア2

Java

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

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

Spring Boot

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

0グッド

0クリップ

投稿2023/06/01 14:50

編集2023/06/02 03:04

実現したいこと

新規ユーザー登録機能を作りたい。

前提

以下のサイトを参考にして、実装を行っております。
https://medium-company.com/spring-boot-thymeleaf%E3%81%A7%E6%96%B0%E8%A6%8F%E7%99%BB%E9%8C%B2%E7%94%BB%E9%9D%A2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/
登録ボタンを押下すると以下のエラーメッセージが発生しました。

現状の画面

イメージ説明
イメージ説明

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

以下文字数制限によって、全文投稿できなかったため、スクリーンショットで表示いたします。

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Jun 02 11:37:50 GMT+09:00 2023 There was an unexpected error (type=Internal Server Error, status=500).

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

該当のソースコード

ディレクトリ構成
イメージ説明
UserController

Java

1package com.example.demo.controller; 2 3import java.util.ArrayList; 4import java.util.List; 5 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.stereotype.Controller; 8import org.springframework.ui.Model; 9import org.springframework.validation.BindingResult; 10import org.springframework.validation.ObjectError; 11import org.springframework.validation.annotation.Validated; 12import org.springframework.web.bind.annotation.GetMapping; 13import org.springframework.web.bind.annotation.ModelAttribute; 14import org.springframework.web.bind.annotation.PathVariable; 15import org.springframework.web.bind.annotation.PostMapping; 16 17import com.example.demo.dto.UserRequest; 18import com.example.demo.entity.User; 19import com.example.demo.service.UserService; 20 21/** 22 * ユーザー情報 Controller 23 */ 24@Controller 25public class UserController { 26 27 /** 28 * ユーザー情報 Service 29 */ 30 @Autowired 31 private UserService userService; 32 33 /** 34 * ユーザー情報一覧画面を表示 35 * @param model Model 36 * @return ユーザー情報一覧画面 37 */ 38 @GetMapping(value = "/user/list") 39 public String displayList(Model model) { 40 List<User> userlist = userService.searchAll(); 41 model.addAttribute("userlist", userlist); 42 return "user/list"; 43 } 44 45 /** 46 * ユーザー新規登録画面を表示 47 * @param model Model 48 * @return ユーザー情報一覧画面 49 */ 50 @GetMapping(value = "/user/add") 51 public String displayAdd(Model model) { 52 model.addAttribute("userRequest", new UserRequest()); 53 return "user/add"; 54 } 55 56 /** 57 * ユーザー新規登録 58 * @param userRequest リクエストデータ 59 * @param model Model 60 * @return ユーザー情報一覧画面 61 */ 62 @PostMapping("/user/create") 63 public String create(@Validated @ModelAttribute UserRequest userRequest, BindingResult result, Model model) { 64 65 if (result.hasErrors()) { 66 // 入力チェックエラーの場合 67 List<String> errorList = new ArrayList<String>(); 68 for (ObjectError error : result.getAllErrors()) { 69 errorList.add(error.getDefaultMessage()); 70 } 71 model.addAttribute("validationError", errorList); 72 return "user/add"; 73 } 74 // ユーザー情報の登録 75 userService.create(userRequest); 76 return "redirect:/user/list"; 77 } 78 79 /** 80 * ユーザー情報詳細画面を表示 81 * @param id 表示するユーザーID 82 * @param model Model 83 * @return ユーザー情報詳細画面 84 */ 85 @GetMapping("/user/{id}") 86 public String displayView(@PathVariable Long id, Model model) { 87 User user = userService.findById(id); 88 model.addAttribute("userData", user); 89 return "user/view"; 90 } 91}

UserRequest

java

1package com.example.demo.dto; 2 3import java.io.Serializable; 4 5import jakarta.validation.constraints.NotEmpty; 6import jakarta.validation.constraints.Pattern; 7import jakarta.validation.constraints.Size; 8import lombok.Data; 9 10/** 11 * ユーザー情報 リクエストデータ 12 */ 13@Data 14public class UserRequest implements Serializable { 15 /** 16 * 名前 17 */ 18 @NotEmpty(message = "名前を入力してください") 19 @Size(max = 100, message = "名前は100桁以内で入力してください") 20 private String name; 21 /** 22 * 住所 23 */ 24 @Size(max = 255, message = "住所は255桁以内で入力してください") 25 private String address; 26 /** 27 * 電話番号 28 */ 29 @Pattern(regexp = "0\\d{1,4}-\\d{1,4}-\\d{4}", message = "電話番号の形式で入力してください") 30 private String phone; 31}

User

java

1package com.example.demo.entity; 2 3import java.io.Serializable; 4import java.util.Date; 5 6import jakarta.persistence.Column; 7import jakarta.persistence.Entity; 8import jakarta.persistence.GeneratedValue; 9import jakarta.persistence.GenerationType; 10import jakarta.persistence.Id; 11import jakarta.persistence.Table; 12import lombok.Data; 13 14/** 15 * ユーザー情報 Entity 16 */ 17@Entity 18@Data 19@Table(name = "user") 20public class User implements Serializable { 21 /** 22 * ID 23 */ 24 @Id 25 @GeneratedValue(strategy = GenerationType.IDENTITY) 26 private Long id; 27 /** 28 * 名前 29 */ 30 @Column(name = "name") 31 private String name; 32 /** 33 * 住所 34 */ 35 @Column(name = "address") 36 private String address; 37 /** 38 * 電話番号 39 */ 40 @Column(name = "phone") 41 private String phone; 42 /** 43 * 更新日時 44 */ 45 @Column(name = "update_date") 46 private Date updateDate; 47 /** 48 * 登録日時 49 */ 50 @Column(name = "create_date") 51 private Date createDate; 52 /** 53 * 削除日時 54 */ 55 @Column(name = "delete_date") 56 private Date deleteDate; 57}

UserRepository

java

1package com.example.demo.repository; 2 3import org.springframework.data.jpa.repository.JpaRepository; 4import org.springframework.stereotype.Repository; 5 6import com.example.demo.entity.User; 7 8/** 9 * ユーザー情報 Repository 10 */ 11@Repository 12public interface UserRepository extends JpaRepository<User, Long> { 13}

UserService

Java

1@Service 2@Transactional(rollbackFor = Exception.class) 3public class UserService { 4 /** 5 * ユーザー情報 Repository 6 */ 7 @Autowired 8 private UserRepository userRepository; 9 10 /** 11 * ユーザー情報 全検索 12 * @return 検索結果 13 */ 14 public List<User> searchAll() { 15 return userRepository.findAll(); 16 } 17 18 /** 19 * ユーザー情報 新規登録 20 * @param user ユーザー情報 21 */ 22 public void create(UserRequest userRequest) { 23 Date now = new Date(); 24 User user = new User(); 25 user.setName(userRequest.getName()); 26 user.setAddress(userRequest.getAddress()); 27 user.setPhone(userRequest.getPhone()); 28 user.setCreateDate(now); 29 user.setUpdateDate(now); 30 userRepository.save(user); 31 } 32 33 /** 34 * ユーザー情報 主キー検索 35 * @return 検索結果 36 */ 37 public User findById(Long id) { 38 return userRepository.findById(id).get(); 39 } 40 41}

add.html

html

1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" 3 xmlns:th="http://www.thymeleaf.org"> 4<head 5 th:replace="common/head :: head_fragment(title = 'ユーザー新規登録', scripts = ~{::script}, links = ~{::link})"></head> 6<body> 7 <div class="container"> 8 <div th:if="${validationError}" th:each="error : ${validationError}"> 9 <label class="text-danger" th:text="${error}"></label> 10 </div> 11 <h1>ユーザー新規登録</h1> 12 <form th:action="@{/user/create}" th:object="${userRequest}" th:method="post"> 13 14 <div class="form-group"> 15 <label>名前:<span class="text-danger"></span></label> 16 <input type="text" th:field="*{name}" class="form-control"> 17 </div> 18 19 <div class="form-group"> 20 <label>住所:</label> 21 <input type="text" th:field="*{address}" class="form-control"> 22 </div> 23 24 <div class="form-group"> 25 <label>電話番号:<span class="text-danger"></span></label> 26 <input type="text" th:field="*{phone}" class="form-control"> 27 </div> 28 <br /> 29 <div class="text-center"> 30 <a href="/user/list" class="btn btn-secondary">キャンセル</a> 31 <input type="submit" value=" 登録 " class="btn btn-primary"> 32 </div> 33 </form> 34 </div> 35</body> 36</html>

list.html

html

1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> 3<head th:replace="common/head :: head_fragment(title = 'ユーザー情報一覧', scripts = ~{::script}, links = ~{::link})"></head> 4<body> 5 <div class="container"> 6 <h1>ユーザー情報一覧</h1> 7 <div class="float-end"> 8 <a th:href="@{/user/add}" class="btn btn-primary">新規登録はこちら</a> 9 </div> 10 <table class="table table-striped"> 11 <thead> 12 <tr> 13 <th>ID</th> 14 <th>名前</th> 15 <th>住所</th> 16 <th>電話番号</th> 17 <th>更新日時</th> 18 <th>登録日時</th> 19 <th>削除日時</th> 20 <th></th> 21 </tr> 22 </thead> 23 <tbody> 24 <tr th:each="user : ${userlist}" th:object="${user}" class="align-middle"> 25 <td th:text="*{id}"></td> 26 <td th:text="*{name}"></td> 27 <td th:text="*{address}"></td> 28 <td th:text="*{phone}"></td> 29 <td th:text="${#dates.format(user.updateDate, 'yyyy/MM/dd')}"></td> 30 <td th:text="${#dates.format(user.createDate, 'yyyy/MM/dd')}"></td> 31 <td th:text="${#dates.format(user.deleteDate, 'yyyy/MM/dd')}"></td> 32 <td><a th:href="@{/user/{id}(id=*{id})}" class="btn btn-secondary">詳細</a></td> 33 </tr> 34 </tbody> 35 </table> 36 </div> 37</body> 38</html>

試したこと

エラーメッセージで調査し、他の登録機能のサイトと見比べても原因はわからず、参考サイトの仕組みにも違和感は感じませんでした。原因を知るため、登録しようとしているデータがどこで止まっているか知る必要があり、UserControllerのuserService.create(userRequest);からUserServiceのcreateメソッドには反応していることまでは理解できました。次にUserServiceのcreateメソッドにブレークポイントを設定するところまではできましたが、持っているデータを閲覧する方法が分からず、教えて頂けると幸いです。
https://www.jetbrains.com/help/objc/examining-suspended-program.html#examine-frames
イメージ説明

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

Windows 11.0
IntelliJ IDEA 2023.1.2 (Community Edition)
MySQL Community Server - GPL Version: 8.0.32
Oracle OpenJDK 17.0.7

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

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

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

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

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

hhhhhhggggg

2023/06/01 16:25

ご指摘ありがとうございます。試したことを追記いたしましたので、アドバイス頂けると幸いです。
jimbe

2023/06/01 17:49 編集

一覧画面からの続きのようですが、一覧は記事通りに表示されたのでしょうか。 デバッガの使い方は別として、まずは例外から何が起きているのかを出来るだけ把握する必要があると思います。 Whitelabel errir page に表示されたのは、スクリーンショットが全てでしょうか、それとももっと下がありますか。 もっと下があるようなら、スクリーンショットでは無くテキストとして(全コピーしてコードと同じようにマークダウンを用いて)質問に追加ご提示ください。 なお、現在コードのマークダウンに書かれている ``` の後のファイル名部分は、言語名を書くところです。( java とか html とか。) ファイル名はマークダウンの外に書いてください。
hhhhhhggggg

2023/06/02 03:09

ご指摘ありがとうございます。エラー内容なのですが、あまりに長く実装ソースを全てスクリーンショットにしたとしても半分投稿できるかどうかといったところでしたので、スクリーンショットになってしまいますが、ご了承ください。
jimbe

2023/06/02 03:45 編集

追加編集ありがとうございます。 文字数制限は、存在の必要性は分かるとは言えプログラミングQAなのに1万文字というのは厳しいのは不満な所ではありますが…。 留意しておいて頂きたいのは、 teratail はQAの形で情報を貯めておいて同じ問題を抱える人に情報を残す目的もあることです。 ですがご自身がされたように例外の文言で検索しても、例外が画像で示されていてはこの質問はヒットしません。 一通り全てをご提示頂くことも大事ですが、コード等は外部のアーカイブサイト(GitHub等)を利用する等で対処して頂くと、文字数をあまり気にしなくて済みます。
guest

回答1

0

ベストアンサー

エラーメッセージで調査し、他の登録機能のサイトと見比べても原因はわからず

Whitelabel Error Page の中に Caused by: java.sql.SQLException: Field 'id' doesn't have a default value という原因の表示があります。
参考記事のほうでは id 列は『主キー(AUTO_INCREMENT)』ということになっていますが、そのように定義されていないのでは無いでしょうか。

投稿2023/06/02 03:08

編集2023/06/02 03:13
jimbe

総合スコア13209

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

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

hhhhhhggggg

2023/06/02 03:27

ありがとうございます! id にAUTO_INCREMENTが設定されておらず、設定したところ登録することができました。 沢山のご指摘等、丁寧に見て頂き感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問