2017-03-09 63 views
0

我目前正在試用Spring Boot,並且已經用Spring Boot和Thymeleaf開發了一些更小的類似CRUD的應用程序。春季靴子和形式Thymeleaf。從模板訪問對象屬性

這裏我控制器

@Controller 
public class Home { 

    @RequestMapping(value="/", method=RequestMethod.GET) 
    public String index(Post post) { 
     return "index"; 
    } 

    @RequestMapping(value = "/", method = RequestMethod.POST) 
    public String addNewPost(@Valid Post post, BindingResult bindingResult, Model model) { 
     if (bindingResult.hasErrors()) { 
      return "index"; 
     } 
     model.addAttribute("title", post.getTitle()); 
     model.addAttribute("content", post.getContent()); 
     return "result"; 
    } 
} 

我的index.html

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"> 
<head> 
<title>Spring Boot and Thymeleaf example</title> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
    <h3>Spring Boot and Thymeleaf, part 2 - forms</h3> 
    <form action="#" th:action="@{/}" th:object="${post}" method="post"> 
     <table> 
      <tr> 
       <td>Title:</td> 
       <td><input type="text" th:field="*{post}" /></td> 
       <td th:if="${#fields.hasErrors('title')}" th:errors="*{title}">Title error message</td> 
      </tr> 
      <tr> 
       <td>Content:</td> 
       <td><input type="text" th:field="*{post}" /></td> 
       <td th:if="${#fields.hasErrors('content')}" th:errors="*{content}">Content error message</td> 
      </tr> 
      <tr> 
       <td><button type="submit">Submit post</button></td> 
      </tr> 
     </table> 
    </form> 
</body> 
</html> 

我不知道,如果不是由一個增加的對象後一個的每個屬性我可以添加對象本身。

我已經試過這

@Controller 
public class Home { 

    @RequestMapping(value="/", method=RequestMethod.GET) 
    public String index(Post post) { 
     return "index"; 
    } 

    @RequestMapping(value = "/", method = RequestMethod.POST) 
    public String addNewPost(@Valid Post post, BindingResult bindingResult, Model model) { 
     if (bindingResult.hasErrors()) { 
      return "index"; 
     } 
     model.addAttribute("post", post);  
     return "result"; 
    } 
} 

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"> 
<head> 
<title>Spring Boot and Thymeleaf example</title> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
    <h3>Spring Boot and Thymeleaf, part 2 - forms</h3> 
    <form action="#" th:action="@{/}" th:object="${post}" method="post"> 
     <table> 
      <tr> 
       <td>Title:</td> 
       <td><input type="text" th:field="*{title}" /></td> 
       <td th:if="${#fields.hasErrors('title')}" th:errors="*{title}">Title error message</td> 
      </tr> 
      <tr> 
       <td>Content:</td> 
       <td><input type="text" th:field="*{content}" /></td> 
       <td th:if="${#fields.hasErrors('content')}" th:errors="*{content}">Content error message</td> 
      </tr> 
      <tr> 
       <td><button type="submit">Submit post</button></td> 
      </tr> 
     </table> 
    </form> 
</body> 
</html> 

但後來我得到這個錯誤:

org.springframework.beans.NotReadablePropertyException: Invalid property 'post' of bean class [com.jvmhub.springboot.form.Post]: Bean property 'post' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:731) 
    at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:572) 
    at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:549) 
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:720) 
    at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99) 
    at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:229) 
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120) 
    at org.thymeleaf.spring4.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:396) 
    at org.thymeleaf.spring4.util.FieldUtils.getBindStatus(FieldUtils.java:323) 
    at org.thymeleaf.spring4.util.FieldUtils.getBindStatus(FieldUtils.java:289) 
    at org.thymeleaf.spring4.processor.attr.AbstractSpringFieldAttrProcessor.processAttribute(AbstractSpringFieldAttrProcessor.java:98) 
    at org.thymeleaf.processor.attr.AbstractAttrProcessor.doProcess(AbstractAttrProcessor.java:87) 
    at org.thymeleaf.processor.AbstractProcessor.process(AbstractProcessor.java:212) 
    at org.thymeleaf.dom.Node.applyNextProcessor(Node.java:1017) 
    at org.thymeleaf.dom.Node.processNode(Node.java:972) 
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) 
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) 
    at org.thymeleaf.dom.Node.processNode(Node.java:990) 
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) 
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) 
    at org.thymeleaf.dom.Node.processNode(Node.java:990) 
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) 
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) 
    at org.thymeleaf.dom.Node.processNode(Node.java:990) 
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) 
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) 
    at org.thymeleaf.dom.Node.processNode(Node.java:990) 
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) 
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) 
    at org.thymeleaf.dom.Node.processNode(Node.java:990) 
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) 
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) 
    at org.thymeleaf.dom.Node.processNode(Node.java:990) 
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) 
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) 
    at org.thymeleaf.dom.Node.processNode(Node.java:990) 
    at org.thymeleaf.dom.Document.process(Document.java:93) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1155) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011) 
    at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335) 
    at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:190) 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244) 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

回答

0

是。只需添加post對象作爲一個模型屬性:

model.addAttribute("post", post); 

要訪問它的屬性簡單地使用:

<td><input type="text" th:text="${post.title}" /></td> 

附:您的表單中的綁定不正確。如果您有th:object="${post}",請訪問其屬性:

<td><input type="text" th:field="*{title}" /></td>