2017-07-13 26 views
0

我可以看到列表被成功地应用于Thymeleaf形式 http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#dynamic-fields如何分配集合中的元素,形成Thymeleaf

<tr th:each="row,rowStat : *{rows}"> 
    <td th:text="${rowStat.count}">1</td> 
    <td> 
    <select th:field="*{rows[__${rowStat.index}__].variety}"><!-- how to do this with Set? --> 
     <option th:each="var : ${allVarieties}" 
       th:value="${var.id}" 
       th:text="${var.name}">Thymus Thymi</option> 
    </select> 
    </td> 
    .. 
</tr> 

我可以做集合而不是List一样吗?特别是在代码中注释的行。 如何将设置元素分配给th:字段?

更新1

我用这个在我的项目,并着手使用设置和提交/添加新行,它给下面的错误。它甚至没有达到相应的控制器方法。

org.springframework.beans.InvalidPropertyException:无效的属性 'catDescrDts [0]' bean类[ae.tbits.atn.aiwacore.common.model.CatDescr]的:非法企图获取属性 'catDescrDts' 扔例外;嵌套异常是org.springframework.beans.InvalidPropertyException:bean类[ae.tbits.atn.aiwacore.common.model.CatDescr]的无效属性'catDescrDts [0]':无法从Set of size 0获取索引为0的元素,使用属性路径'catDescrDts [0]'访问'

CatDescrDts对应于示例中的行,它与CatDescr实体具有多对一的关系。

堆栈跟踪

Caused by: org.springframework.beans.InvalidPropertyException: Invalid property 'catDescrDts[0]' of bean class [ae.tbits.atn.aiwacore.common.model.CatDescr]: Cannot get element with index 0 from Set of size 0, accessed using property path 'catDescrDts[0]' 
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:661) 
... 51 more 
2017-07-13 16:23:57 ERROR ErrorController:19 - Exception during execution of SpringSecurity application 
org.springframework.beans.InvalidPropertyException: Invalid property 'catDescrDts[0]' of bean class [ae.tbits.atn.aiwacore.common.model.CatDescr]: Illegal attempt to get property 'catDescrDts' threw exception; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'catDescrDts[0]' of bean class [ae.tbits.atn.aiwacore.common.model.CatDescr]: Cannot get element with index 0 from Set of size 0, accessed using property path 'catDescrDts[0]' 
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:708) 
at org.springframework.beans.AbstractNestablePropertyAccessor.getNestedPropertyAccessor(AbstractNestablePropertyAccessor.java:836) 
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyAccessorForPropertyPath(AbstractNestablePropertyAccessor.java:813) 
at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:270) 
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95) 
at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:834) 
at org.springframework.validation.DataBinder.doBind(DataBinder.java:730) 
at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:192) 
at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:106) 
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.bindRequestParameters(ServletModelAttributeMethodProcessor.java:150) 
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:114) 
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) 
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) 
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) 
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) 
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) 
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) 
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) 
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) 
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) 
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) 
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284) 
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263) 
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) 
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174) 
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202) 
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

Caused by: org.springframework.beans.InvalidPropertyException: Invalid property 'catDescrDts[0]' of bean class [ae.tbits.atn.aiwacore.common.model.CatDescr]: Cannot get element with index 0 from Set of size 0, accessed using property path 'catDescrDts[0]' 
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:661) 
... 51 more 

更新2

把一些代码..

  1. 创建时第一次调用,形式显示出来罚款与空行。
  2. 当我点击保存或添加新行时,在调用save()之前抛出该错误。
  3. 如果我注释掉:字段行,错误消失了。

控制器

@GetMapping({"/create"}) 
public String create(ModelMap model){ 
    CatDescr catDescr = new CatDescr();   
    //add 1 empty row for catDescrDt 
    int noOfCatDescrDts = 1; 
    catDescr.setCatDescrDts(getNewCatDescrDts(noOfCatDescrDts, catDescr)); 
    model.addAttribute("catDescr", catDescr); 
    return "catDescr/create"; 
} 

@PostMapping(value="/create", params={"save"}) 
public String save(final CatDescr catDescr 
     , final BindingResult bindingResult, final ModelMap model){  
    ... 
    CatDescr updatedCatDescr = catDescrService.save(catDescr); 
    model.clear(); 
    return "redirect:/catDescr/create"; 

} 

@RequestMapping(value="/create", params={"addCatDescrDtRow"}) 
public String addCatDescrDtRow(ModelMap model, final CatDescr catDescr, final BindingResult bindingResult) { 
    catDescr.getCatDescrDts().add(new CatDescrDt()); 
    ... 
    return "catDescr/create"; 
} 

查看

<ul th:each="item, stat: *{catDescrDts}"> 
<li> 
    <input type="text" th:field="*{catDescrDts[__${stat.index}__].name}" th:id="${'catDescrDts'+stat.index+'.name'}"> 
</li> 

+0

是的,它应该适用于Set以及事实上任何Iterable或数组应该没问题。虽然您可能无法保证Set元素的顺序。 – Ranjeet

+0

试过了,不起作用。错误似乎在设置被访问像数组一样的线上。发布堆栈跟踪..谢谢。 –

+0

这个异常似乎说你正试图访问集合中的第一个元素,但是这个集合是空的。 – Janar

回答

0

不得不使用定制的getter/setter的实体返回设为列表,绑定在Thymeleaf列表代替它可以通过索引访问。

控制器必须将List成员与Set成员同步。

所有荣誉@Dark,精彩的解释以及有用的链接。

相关问题