如何在<form:input>中打印Set的值,该值是表单主对象的字段</form:input>

时间:2015-02-13 10:08:14

标签: java spring jsp spring-mvc spring-form

我有一个名为Menu的对象。它有一个名为voceMenuList的字段,它是一个Set

@Component
@Entity
@Table(name="menu")
@Configurable
public class Menu implements Serializable{      
    ....        
    @OneToMany(mappedBy="menu", fetch=FetchType.EAGER)
    private Set<VoceMenu> voceMenuList; 

    public Set<VoceMenu> getVoceMenuList() {
        return voceMenuList;
    }

    public void setVoceMenuList(Set<VoceMenu> voceMenuList) {
        this.voceMenuList = voceMenuList;
    }
    .....   
}

我正在尝试构建一个表单来保存或更新菜单。我做了一些事情链接:

<form:form action="editMenu" method="post" commandName="menu">        
    ......  
    <c:forEach items="${menu.voceMenuList}" varStatus="counter">            
        <form:input path="voceMenuList[${counter.index}].id" maxlength="11"/>
     .....

但是,当我尝试保存对象Menu时,我收到此错误:

Invalid property 'voceMenuList[0]' of bean class [com.springgestioneerrori.model.Menu]: Cannot
get element with index 0 from Set of size 0, 
accessed using property path 'voceMenuList[0]'

我处理forEach的方式不正确

1 个答案:

答案 0 :(得分:1)

路径是相对于你的commandName,并且你遇到问题'因为框架试图在 Menu bean中找到属性voceMenu,你应该使用JSTL的状态对象,如

<c:forEach items="${menu.voceMenuList}" var="voceMenu" varStatus="count">

而不是

<form:input path="voceMenuList[${count.index}].id" maxlength="11"/>

为了正确绑定值

更新您的评论

您面临的进一步问题与动态添加到集合相关,此帖子解释得很好,并列出了可能的解决方案Spring 3 MVC: one-to-many within a dynamic form (add/remove on create/update)

您始终可以选择使用表单支持bean,然后填充您的实体。它可以帮助您缓解此问题,并将您的观点与实体分离,例如使其更好地抵御属性名称更改