##やりたいこと
SpringBootとThymeleafでWEBアプリを開発しております。
テーブルの端にチェックボックスを用意し、ボタンを押すとチェックした項目をすべてDBから削除するような処理を作ろうとしています。
テーブルの表示まではできたのですが、Contorollerに受け渡すことができず質問させていただきました。
Excelのスクリーンショットですが完成イメージです↓
※削除ボタンを押すとDBから「tanaka」と「yamada」が削除されるイメージです。
##ソースコード
Java
1import lombok.Data; 2 3@Data 4public class Person { 5 private int id; 6 private String name; 7 private int age; 8 private boolean checked; 9 10 public Person(int id, String name, int age, boolean checked) { 11 this.setId(id); 12 this.setName(name); 13 this.setAge(age); 14 this.setChecked(checked); 15 } 16} 17
Java
1import java.util.List; 2import lombok.Data; 3 4@Data 5public class PersonForm { 6 private List<Person> personList; 7} 8
Java
1//Controller 2@RequestMapping("/editPersonList") 3 public String editPersonList(Model model) { 4 Person person1 = new Person(1, "tanaka", 30, false); 5 Person person2 = new Person(2, "tanaka", 40, false); 6 Person person3 = new Person(3, "tanaka", 50, false); 7 8 List<Person> personList = new ArrayList<Person>(); 9 personList.add(person1); 10 personList.add(person2); 11 personList.add(person3); 12 13 PersonForm personForm = new PersonForm(); 14 personForm.setPersonList(personList); 15 16 model.addAttribute("personForm", personForm); 17 18 return "/editPersonList"; 19 } 20 21 @PostMapping("/updatePersonList") 22 public String updatePersonList(@ModelAttribute PersonForm personForm) { 23 // DB更新処理 24 System.out.println(personForm); 25 26 return "redirect:/top_page"; 27 }
html
1<!DOCTYPE html> 2<html lang="jp"> 3<html xmlns:th="http://www.thymeleaf.org"> 4 5<head> 6 <title>ユーザー編集</title> 7 <meta charset="UTF-8"> 8 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <link rel="stylesheet" type="text/css" href="/css/new_common.css"> 10</head> 11 12<body> 13 <div th:replace="header_design :: header_design"></div> 14 <div style="margin-top: 100px;">テスト用画面</div> 15 <p>ユーザ一覧</p> 16 <form th:action="@{/updatePersonList}" th:method="post" th:object="${personForm}"> 17 <table> 18 <thead> 19 <tr> 20 <td>ID</td> 21 <td>名前</td> 22 <td>年齢</td> 23 <td>削除フラグ</td> 24 </tr> 25 </thead> 26 <tbody> 27 <th:block th:each="person,stat : *{personList}"> 28 <tr> 29 <td><input type="text" th:field="*{personList[__${stat.index}__].id}"></td> 30 <td><input type="text" th:field="*{personList[__${stat.index}__].name}"></td> 31 <td><input type="text" th:field="*{personList[__${stat.index}__].age}"></td> 32 <td><input type="checkbox" th:field="*{personList[__${stat.index}__].checked}"></td> 33 <!-- ↓試したけどエラーが発生した--> 34 <!-- <td><input type="text" th:field="${person.id}"></td> 35 <td><input type="text" th:field="${person.name}"></td> 36 <td><input type="text" th:field="${person.age}"></td> 37 <td><input type="checkbox" th:field="${person.checked}"></td> --> 38 </tr> 39 </th:block> 40 </tbody> 41 </table> 42 <input type="submit" value="更新"> 43 </form> 44</body> 45 46</html>
##エラーメッセージ
文字数制限のため下の方を削っております。
This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Mar 06 14:45:23 JST 2020 There was an unexpected error (type=Internal Server Error, status=500). Invalid property 'personList[0]' of bean class [com.example.mistuto.model.PersonForm]: Illegal attempt to get property 'personList' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'personList' of bean class [com.example.mistuto.model.PersonForm]: Could not instantiate property type [com.example.mistuto.model.Person] to auto-grow nested property path; nested exception is java.lang.NoSuchMethodException: com.example.mistuto.model.Person.<init>() org.springframework.beans.InvalidPropertyException: Invalid property 'personList[0]' of bean class [com.example.mistuto.model.PersonForm]: Illegal attempt to get property 'personList' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'personList' of bean class [com.example.mistuto.model.PersonForm]: Could not instantiate property type [com.example.mistuto.model.Person] to auto-grow nested property path; nested exception is java.lang.NoSuchMethodException: com.example.mistuto.model.Person.<init>() at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:707) at org.springframework.beans.AbstractNestablePropertyAccessor.getNestedPropertyAccessor(AbstractNestablePropertyAccessor.java:839) at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyAccessorForPropertyPath(AbstractNestablePropertyAccessor.java:816) at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:256) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:97) at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:848) at org.springframework.validation.DataBinder.doBind(DataBinder.java:744) at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:197) at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:107) at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.bindRequestParameters(ServletModelAttributeMethodProcessor.java:158) at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:160) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
参考にさせて頂いたサイト
https://area-b.com/blog/2015/02/04/2009/
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/09 04:49