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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Java

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

Spring

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

Q&A

解決済

1回答

3605閲覧

Spring Data Jpaで検索機能を実装したい

naoyuki42

総合スコア3

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Java

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

Spring

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

0グッド

0クリップ

投稿2021/03/21 07:23

前提・実現したいこと

DB内の情報を検索して一覧として表示する機能をSpring data jpaで実装したいのですが、
下記のソースコードでは下記のようなエラーとなり検索ができないです。
解決方法のわかる方がいらっしゃったら教えて頂きたいです。

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

2021-03-21 16:10:45.789 WARN 12680 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'name' is not present]

該当のソースコード

index

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 4<head> 5<meta charset="UTF-8"> 6<title>社員名簿</title> 7<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" /> 8<link rel="stylesheet" href="/app.css" /> 9</head> 10 11<body> 12 13 <h1 class="header">社員名簿</h1> 14 15 <div> 16 <div> 17 <form action="/namelist/search" th:object="${namelist}" method="GET" align="center"> 18 <p>名前:<input type="text" th:value="${name}"></p> 19 <p>役職:<input type="text"></p> 20 <p>支店:<input type="text"></p> 21 <div class="button"> 22 <input type="submit" value="検索"> 23 <input type="button" onclick="location.href='/namelist' "value="クリア"> 24 </div> 25 </form> 26 </div> 27 <br/> 28 <table align="center" class="table table-striped"> 29 <thead> 30 <tr> 31 <th>社員ID</th> 32 <th>名前</th> 33 <th>役職</th> 34 <th>支店</th> 35 <th>電話番号</th> 36 <th>メールアドレス</th> 37 <th></th> 38 </tr> 39 </thead> 40 <tbody> 41 <tr th:each="namelist:${namelist}" th:object="${namelist}"> 42 <td th:text="*{id}"></td> 43 <td th:text="*{name}"></td> 44 <td th:text="*{position}"></td> 45 <td th:text="*{branch}"></td> 46 <td th:text="*{tell}"></td> 47 <td th:text="*{address}"></td> 48 <td> 49 <form th:action="@{/namelist/edit/{id}(id=*{id})}" th:method="post"> 50 <input type="submit" value="編集"> 51 </form> 52 </td> 53 </tr> 54 </tbody> 55 </table> 56 <div class="button"> 57 <input type="button" onclick="location.href='/namelist/nameadd' "value="名前を追加"> 58 </div> 59 </div> 60 61</body> 62</html>

Controller

1 @GetMapping("/namelist/search") 2 public String search(@RequestParam String name, 3 Model model) { 4 List<entity> namelist = Repository.findByName(name); 5 model.addAttribute("namelist", namelist); 6 return "index"; 7 }

Repository

1@Repository 2public interface repository extends JpaRepository<entity, Long>{ 3 4 List<entity> findByName(String name); 5 6}

Entity

1package com.practice; 2 3import javax.persistence.Column; 4import javax.persistence.Entity; 5import javax.persistence.Id; 6import javax.persistence.Table; 7 8@Entity 9@Table(name = "namelist") 10public class entity { 11 12 @Id 13 @Column(name = "id") 14 private Long id; 15 16 @Column(name = "name") 17 private String name; 18 19 @Column(name = "position") 20 private String position; 21 22 @Column(name = "branch") 23 private String branch; 24 25 @Column(name = "tell") 26 private String tell; 27 28 @Column(name = "address") 29 private String address; 30 31 public entity() { 32 } 33 34 public entity(Long id, 35 String name, 36 String position, 37 String branch, 38 String tell, 39 String address) { 40 this.id = id; 41 this.name = name; 42 this.position = position; 43 this.branch = branch; 44 this.tell = tell; 45 this.address = address; 46 } 47 48 public entity(String name) { 49 this.name = name; 50 } 51 52 public Long getId() { 53 return id; 54 } 55 56 public void setId(Long id) { 57 this.id = id; 58 } 59 60 public String getName() { 61 return name; 62 } 63 64 public void setName(String name) { 65 this.name = name; 66 } 67 68 public String getPosition() { 69 return position; 70 } 71 72 public void setPosition(String position) { 73 this.position = position; 74 } 75 76 public String getBranch() { 77 return branch; 78 } 79 80 public void setBranch(String branch) { 81 this.branch = branch; 82 } 83 84 public String getTell() { 85 return tell; 86 } 87 88 public void setTell(String tell) { 89 this.tell = tell; 90 } 91 92 public String getAddress() { 93 return address; 94 } 95 96 public void setAddress(String address) { 97 this.address = address; 98 } 99 100} 101 102```__イタリックテキスト__

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

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

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

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

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

guest

回答1

0

ベストアンサー

コントローラのメソッドは、以下のようになっています。

java

1@GetMapping("/namelist/search") 2public String search(@RequestParam String name, Model model) {

この場合、Springは、GETリクエストにnameという名前のクエリーパラメータが付いてくることを期待します。

一方、検索フォームは、以下のようになっています。

html

1<p>名前:<input type="text" th:value="${name}"></p>

このinput要素にはname属性が無いので、submitしたとき、入力内容はサーバに送信されないと思います。

そのため、冒頭に書かれているようなエラーメッセージ(「リクエストにnameパラメータが無い」)が出てしまいます。

解決策は、name属性を付けることです。役職や支店名でも検索するなら、以下のような感じにすれば良いでしょう。

html

1<p>名前:<input type="text" name="name"></p> 2<p>役職:<input type="text" name="position"></p> 3<p>支店:<input type="text" name="branch"></p>

ページを開いたときに、入力欄に初期値を表示したい場合は、th:valueも付けてください。


また、もし、nameパラメータが来ない可能性もある場合は、メソッドの引数のアノテーションを以下のように変えましょう。

java

1@GetMapping("/namelist/search") 2public String search( 3 @RequestParam(name = "name", required = false) String name, 4 Model model) {

投稿2021/03/21 11:00

gpsoft

総合スコア1323

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

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

naoyuki42

2021/03/21 11:16

非常に分かりやすく丁寧なご説明ありがとうございます。 問題が解決致しました。 1つお聞きしたいのですが、 >>また、もし、nameパラメータが来ない可能性もある場合は、メソッドの引数のアノテーションを以下のように変えましょう。 に関して、例えば名前、役職、支店で検索する場合に、nameパラメータに何も入力せずに、役職、支店のみで検索したい場合に、引数nameのアノテーション内の required = falseとすれば良いという認識で合っているでしょうか。
gpsoft

2021/03/21 11:35

ちょっと違います。 たとえ入力欄に何も入力してなくても、パラメータは来ます(値は空文字列になる)。 一方、`input`要素自体が無いとか、`input`要素はあるけど`disabled`になってる、といった場合は、パラメータが来ません。なので、動的に入力欄を増減させたり無効化するようなケースでは、required=falseを使う必要が出てくるかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問