Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 如何将集合元素分配给Thymeleaf中的form字段_Spring Mvc_Thymeleaf - Fatal编程技术网

Spring mvc 如何将集合元素分配给Thymeleaf中的form字段

Spring mvc 如何将集合元素分配给Thymeleaf中的form字段,spring-mvc,thymeleaf,Spring Mvc,Thymeleaf,我可以看到列表在Thymeleaf表单中的成功使用 更新2 把一些代码 第一次调用create时,表单显示为空行 当我单击“保存”或“添加新行”时,在调用controller save()之前会出现该错误 若我注释掉th:字段行,那个么错误就消失了 控制器 @GetMapping({"/create"}) public String create(ModelMap model){ CatDescr catDescr = new CatDescr(); //ad

我可以看到列表在Thymeleaf表单中的成功使用

更新2

把一些代码

  • 第一次调用create时,表单显示为空行
  • 当我单击“保存”或“添加新行”时,在调用controller save()之前会出现该错误
  • 若我注释掉th:字段行,那个么错误就消失了
  • 控制器

    @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";
    }
    
    看法


    必须在实体中使用自定义getter/setter返回Set as List,而是在Thymeleaf中绑定该列表,以便通过索引访问它

    在中,控制器必须将列表成员与集合成员同步


    所有这些都归功于@Dark,精彩的解释以及有用的链接。

    是的,它应该可以很好地与Set一起工作,事实上,任何Iterable或数组都应该很好。虽然您可能无法保证集合元素的顺序。如果尝试,则无效。错误似乎出现在像数组一样访问集合的行上。已发布堆栈跟踪。。谢谢。异常似乎表明您正试图从集合中访问第一个元素,但集合是空的。@Janar是的,您是对的。除了代码中的任何地方,我都尝试直接访问集合的元素,例如[0]。检查我的控制器,设置不为空。视图最初显示表单,当我发布(保存或添加新行)时,我收到此错误。堆栈跟踪似乎指示发布时出错,而不是到达控制器。将把代码片段放在更新2中。对不起,我想我误解了你的问题。也许我应该澄清一下,您可以在Thymeleaf中使用Set fine的计数器和索引,但不能将控制器中的Set直接绑定到对象。Spring使用getter和setter来绑定它不能通过使用集合的索引来绑定的对象。尝试自定义getter/setter,如
    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
    
    @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>