前提・実現したいこと
いつもお世話になっております。
Spring Boot+Thymeleafで画面から入力されたリストの情報をフォームで受け取りたいです。
正確にはリストの中にあるリスト(二次元配列)の情報を受け取りたいです。
Springにおいて画面のリスト状になっている情報をコントローラーで取得したいを参照して、リストになっている情報をコントローラーで受け取る処理の実装を試みましたがうまく値が渡らず、formから受け取る値がnullになってしまいます。
これは、リストの中にリストがない場合なので、リストの中にリストがある書き方に躓いてしまいました。
前回質問した、SpringBoot フォームで複数レコードの値を受け取れないでは、リストの0番目の情報がすべての番号に反映されて更新されるだけの処理でした。
イメージ画像は以下の通りです。送信ボタンを押されると、一気にレコードが更新されるイメージです。
今回リストで更新したいのは、期中・期末の目標ウエイト(goalWeight)のみです。
目標番号のリストの中にウェイトのリストが入っていて、その値をformに送信します。
表示自体はできるのですが、javaに値がどうしても渡りません。
Thymeleafの書き方がおかしいのだと思います。
ご教授お願いします。
発生している問題・エラーメッセージ
Formからリストの値が受け取れない
該当のソースコード
GoalSeqForm.java
java
1package jp.co.itc.mbo.form; 2 3import java.util.List; 4 5import javax.persistence.OneToMany; 6 7import jp.co.itc.mbo.entity.Meisai; 8 9public class GoalSeqForm { 10 11 private String goaltitle; 12 private Integer year; 13 private String goaldetail; 14 15 @OneToMany(mappedBy = "goalseqid") 16 private List<Meisai> meisaiList; 17 18 19 public String getGoaltitle() { 20 return goaltitle; 21 } 22 public void setGoaltitle(String goaltitle) { 23 this.goaltitle = goaltitle; 24 } 25 public Integer getYear() { 26 return year; 27 } 28 public void setYear(Integer year) { 29 this.year = year; 30 } 31 public String getGoaldetail() { 32 return goaldetail; 33 } 34 public void setGoaldetail(String goaldetail) { 35 this.goaldetail = goaldetail; 36 } 37 38 public List<Meisai> getMeisaiList() { 39 return meisaiList; 40 } 41 public void setMeisaiList(List<Meisai> meisaiList) { 42 this.meisaiList = meisaiList; 43 } 44 45 46 47} 48 49
MeisaiForm.java
java
1package jp.co.itc.mbo.form; 2 3import java.util.List; 4 5import javax.persistence.JoinColumn; 6import javax.persistence.ManyToOne; 7 8import jp.co.itc.mbo.entity.GoalSeq; 9 10public class MeisaiForm { 11 12 private Boolean target; 13 private List <Integer> goalWeight; 14 private Integer evalution; 15 private String selfComment; 16 private String bossComment; 17 private Integer reviewCheck; 18 private Integer status; 19 private Double score; 20 21 @ManyToOne(targetEntity = GoalSeq.class) 22 @JoinColumn( name = "goalseq_id") 23 private GoalSeq goalseqid; 24 25 public Boolean getTarget() { 26 return target; 27 } 28 29 public void setTarget(Boolean target) { 30 this.target = target; 31 } 32 33 public List<Integer> getGoalWeight() { 34 return goalWeight; 35 } 36 37 public void setGoalWeight(List<Integer> goalWeight) { 38 this.goalWeight = goalWeight; 39 } 40 41 public Integer getEvalution() { 42 return evalution; 43 } 44 45 public void setEvalution(Integer evalution) { 46 this.evalution = evalution; 47 } 48 49 public String getSelfComment() { 50 return selfComment; 51 } 52 53 public void setSelfComment(String selfComment) { 54 this.selfComment = selfComment; 55 } 56 57 public String getBossComment() { 58 return bossComment; 59 } 60 61 public void setBossComment(String bossComment) { 62 this.bossComment = bossComment; 63 } 64 65 public Integer getReviewCheck() { 66 return reviewCheck; 67 } 68 69 public void setReviewCheck(Integer reviewCheck) { 70 this.reviewCheck = reviewCheck; 71 } 72 73 public Integer getStatus() { 74 return status; 75 } 76 77 public void setStatus(Integer status) { 78 this.status = status; 79 } 80 81 public Double getScore() { 82 return score; 83 } 84 85 public void setScore(Double score) { 86 this.score = score; 87 } 88 89 public GoalSeq getGoalseqid() { 90 return goalseqid; 91 } 92 93 public void setGoalseqid(GoalSeq goalseqid) { 94 this.goalseqid = goalseqid; 95 } 96 97 98} 99
Controller
java
1 @RequestMapping(value = "{id}/weight_input") 2 String weightInput(@PathVariable Integer id,Model model) { 3 List<GoalSeq> goalseqs = goalseqservice.findCurrent(id); 4 model.addAttribute("goalseqs", goalseqs); 5 return "goals/weight_input";} 6 7 @RequestMapping(value = "/weight_complete/{id}", method = RequestMethod.POST) 8 String weightRegist(@PathVariable Integer id,@Valid GoalSeqForm goalseqform, Principal principal,BindingResult bindingResult) { 9 if (bindingResult.hasErrors()) { 10 //処理未記述 11 } 12 //↓ここでヌルポ 13 GoalSeqForm forms=goalseqform; 14 List <GoalSeq> goalseqs=goalseqservice.findCurrent(id); 15 for(GoalSeq goalseq: goalseqs) { 16 for (int i = 0; i <= 2; i++) { 17 //処理は未記述ですがここで、フォームから受け取った値を更新する記述をします 18 } 19 } 20 return "redirect:/{id}"; 21 }
weight_input.html
HTML
1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>Insert title here</title> 6</head> 7<body> 8 <form method="post" 9 th:action="@{/weight_complete/}+${goalseqs[0].userid.id}" 10 th:object="${meisaiForm}"> 11 <table> 12 <tr> 13 <th>目標番号</th> 14 <th>期中ウエイト</th> 15 <th>期末ウエイト</th> 16 <th></th> 17 </tr> 18 <tr th:each="goalseq,st: ${goalseqs}"> 19 <td><p th:text="${goalseq.goalid}"></p></td> 20 <td><input type=number name="meisaiList[1].goalWeight" 21 th:name="'MeisaiList[' +${st.index} +'].[1].goalWeight'" 22 th:value="${goalseq.meisaiList[1].goalWeight}"></td> 23 <td><input type=number name="meisaiList[2].goalWeight" 24 th:name="'MeisaiList[' +${st.index}+ '].[2].goalWeight'" 25 th:value="${goalseq.meisaiList[2].goalWeight}"></td> 26 </tr> 27 </table> 28 <button type=submit>送信</button> 29 </form> 30</body> 31</html>
試したこと
・GoalSeqでeachを回すのではなく、Meisaiで回したらフォームに値が渡りました
→この方法で解決しましたがこの解決方法は、Springにおいて画面のリスト状になっている情報をコントローラーで取得したいと同じになってしまうので質問を残してあります。
補足情報(FW/ツールのバージョンなど)
FormクラスのGoalSeqのレコード1つに対して、MeisaiのレコードはmeisaiListとして3つOneToManyで紐づいています。
目標1つに対して、外部テーブルで期初、期中、期末のステータスを紐づけています。
期初にあたるmeisaiListの0番目は更新する必要がないので、nameのところでは、
期中を「meisaiList[1].goalWeight」
期末を「meisaiList[2].goalWeight」
と表記しています。
初心者で至らない点があると思いますがよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー