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

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

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

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

Spring Boot

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

Q&A

解決済

2回答

2600閲覧

SpringBootで編集画面でのバリデーションが効いた際に、プルダウンの値を保持したままリダイレクトする方法がわからない

developer1223

総合スコア6

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2022/10/13 02:22

編集2022/10/13 06:33

前提

SpringBootで従業員管理のシステムを作成しております。
従業員情報の更新処理でバリデーションが効いた際にリダイレクトで編集画面に戻りたいのですが、フォームに入力している値はth:fieldで取得できるのですが、プルダウンで選択していた値がth:selectedを使用しているため、th:fieldを使用できず、プルダウンで選択していた値を保持したまま編集画面にリダイレクトすることができません。
どう記述すればバリデーションをかけつつ値を保持してリダイレクトできるでしょうか。

プルダウンの中身はGETメソッドの際にデータベースから取得し、表示しております。

実現したいこと

  • 従業員の更新処理でバリデーションが効いた際にフォーム・プルダウンの値を保持して編集画面にリダイレクトしたい

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

エラーメッセージなし

該当のソースコード

Java

1@Controller 2public class EmpController { 3 4 @Autowired 5 private EmpService empService; 6 7 @Autowired 8 JdbcTemplate jdbcTemplate; 9 10 //編集画面の表示のGETメソッド 11 @GetMapping("/employeeDetail/{id}/edit") 12 public String displayEdit(@PathVariable("id") String id, Model model) { 13 //バリデーションエラーが出た場合データを保持した状態で表示する 14 if (!model.containsAttribute("employee")) { 15 Employee employee = empService.selectOne(id); 16 model.addAttribute("employee", employee); 17 } 18 19 //法人のプルダウンリスト表示 20 List<Company> company = empService.getCompanyAll(); 21 model.addAttribute("company", company); 22 23 return "edit"; 24 } 25 26 //更新処理のPOSTメソッド 27 @PostMapping("/employeeDetail/{id}/update") 28 public String postUpdate(@Validated Employee employee,BindingResult bindingResult,RedirectAttributes attributes,Model model,@PathVariable("id") String id) { 29 if (bindingResult.hasErrors()) { 30     employee = empService.selectOne(id); 31     attributes.addFlashAttribute("org.springframework.validation.BindingResult.employee", bindingResult); 32 attributes.addFlashAttribute("employee", employee); 33 34 //法人のプルダウンリスト表示 35 List<Company> company = empService.getCompanyAll(); 36 model.addAttribute("company", company); 37 38 return "edit"; 39 } 40 41    //従業員情報の更新処理(ここは正しく動く) 42    jdbcTemplate.update("update m_employee set name = ?,telephone_number = ?,mail_address = ?,company_id = ? where id = " + id, 43 employee.getName(), 44 employee.getTelephonenumber(), 45 employee.getMailaddress(), 46 employee.getCompany_id()); 47 48    return "redirect:/employeeDetail/{id}"; 49 } 50}

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head th:replace="header::head(~{::title})"> 4<meta charset="UTF-8"> 5<link th:href="@{/webjars/bootstrap/5.1.3/css/bootstrap.min.css}" rel="stylesheet"/> 6<title>従業員データベース</title> 7</head> 8<body> 9 <header th:replace="header::header"></header> 10 <div class="container"> 11 <div class="col-sm-5"> 12 <div class="page-header"> 13 <h2>従業員編集</h2> 14 </div> 15 <form method="post" th:object="${employee}" th:action="@{'/employeeDetail/' + ${employee.id} + '/update'}"> 16 <table class="table table-bordered table-hover"> 17 <tr> 18 <th class="active">氏名</th> 19 <td> 20 <div class="form-group"> 21 <input type="text" class="form-control" th:field="*{name}"></input> 22 <span class="errorStr" th:errors="*{name}"></span> 23 </div> 24 </td> 25 </tr> 26 <tr> 27 <th class="active">電話番号</th> 28 <td> 29 <div class="form-group"> 30 <input type="text" class="form-control" th:field="*{telephonenumber}"></input> 31 </div> 32 </td> 33 </tr> 34 <tr> 35 <th class="active">メールアドレス</th> 36 <td> 37 <div class="form-group"> 38 <input type="text" class="form-control" th:field="*{mailaddress}"></input> 39 </div> 40 </td> 41 </tr> 42 <tr> 43 <th class="active">法人名</th> 44 <td> 45 <div class="form-group"> 46 <select id="company" name="company_id"> 47 <option 48 th:each="company : ${company}" 49 th:value="${company.company_id}" 50 th:text="${company.company_name}" 51 th:selected="${company.company_name} == *{company_name}"> 52 </option> 53 </select> 54 </div> 55 </td> 56 </tr> 57 </table> 58 <button class="btn btn-primary" type="submit">更新</button> 59 </form> 60 </div> 61 </div> 62</body> 63</html>

Java

1@Entity 2@Data 3@Table(name="m_company") 4public class Company implements Serializable{ 5 6 @Id 7 @Column(name = "id", nullable = false) 8 private int company_id; 9 10 @Column(name = "company_name", nullable = false) 11 private String company_name; 12}

Java

1@Repository 2public interface CompanyRepository extends JpaRepository<Company, String>{ 3 4}

試したこと

編集画面のHTMLで<select>タグ内にth:fieldを書いてみたが、編集画面に遷移した際th:selectedの値が保持されなかった

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2022/10/13 02:58

> ↓更新処理(省略) これが何を示しているのか分かりませんが、returnの後には書けないと思います。 実際のコードにない情報は混乱の元なのでなくしていただきたく(せめてコードに影響ないようコメントアウトするとかの配慮を)
developer1223

2022/10/13 03:14

コントローラーの修正をいたしました。失礼しました。
guest

回答2

0

自己解決

少し無理やりなやり方ですが
・従業員情報を取得するメソッドをリダイレクトする前に挟んでおく
・プルダウンのデータもaddFlashAttributeしてリダイレクトする
ことでデータを保持したままバリデーションをかけることができました。

Java

1//更新処理のPOSTメソッド 2 @PostMapping("/employeeDetail/{id}/update") 3 public String postUpdate(@Validated Employee employee,BindingResult bindingResult,RedirectAttributes attributes,Model model,@PathVariable("id") String id) { 4 if (bindingResult.hasErrors()) { 5 //idを基に従業員情報を取得する 6     employee = empService.selectOne(id); 7     attributes.addFlashAttribute("org.springframework.validation.BindingResult.employee", bindingResult); 8 attributes.addFlashAttribute("employee", employee); 9 10 //法人のプルダウンリスト表示 11 List<Company> company = empService.getCompanyAll(); 12 attributes.addFlashAttribute("company", company); 13 14 return "redirect:/employeeDetail/{id}/edit"; 15 }

投稿2022/10/13 07:08

編集2022/10/13 07:10
developer1223

総合スコア6

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

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

m.ts10806

2022/10/13 07:12

無理やりでも何でもないと思います。 POSTされたときに持っているのはあくまで入力情報だけですし、 「再取得して入力情報に書き換え」のような対応はむしろ正しいと思います。
developer1223

2022/10/13 08:34

ありがとうございます。 解決にご協力いただきありがとうございました!
guest

0

リダイレクトではなくdisplayEdit()のときと同じようにmodelに必要な情報詰め込んでreturn "edit";して単純にviewを呼び出せば良いのではないでしょうか。

投稿2022/10/13 04:07

m.ts10806

総合スコア80850

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

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

developer1223

2022/10/13 04:26

return "edit"; だとプルダウンが表示されなくなってしまいます。。
m.ts10806

2022/10/13 04:28

回答にある「modelに必要な情報詰め込んで」は対応されましたか?
developer1223

2022/10/13 06:30

失礼しました。Modelに必要な情報を受け渡すと、return "edit";でプルダウンが消えることはなくなりましたが、プルダウンの値の保持をすることができませんでした。 コントローラーの更新処理の記述を修正しました。ご確認いただけると幸いです。
m.ts10806

2022/10/13 06:34

employee.company_nameが渡ってないとかではないでしょうか。 他の項目はどうですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問