如何使用@ModelAttribute将List绑定到JSP表单的控制器

时间:2011-07-06 23:43:19

标签: java jsp spring-mvc

我正在尝试使用@modelAttribute及其各自的id和blurb来获取我的控制器的所选候选者列表。我可以正确地带一个候选人,但我不知道如何通过...我试图添加列表<>正如我在下面所示,但我得到了

  

错误 -   严重:servlet [dispatcher]的Servlet.service()在上下文中与路径[/ panel-requests]抛出异常[请求处理失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[java.util.List]:指定的类是一个具有根本原因的接口]   org.springframework.beans.BeanInstantiationException:无法实例化bean类[java.util.List]:指定的类是一个接口

JSP -

<form:form modelAttribute="candidateAddAttribute" 
  action="/panel-requests/requests/${panelRequestForId.id}/empl" method="post">
<c:forEach items="${candidates}" var="candidates">
    <select name="employee" id="employee" disabled="disabled">
        <option value="default" selected="selected">${candidates.candidateName}</option>
    </select>
    <textarea rows="3" cols="40" id="candidateBlurb" name="candidateBlurb" 
      disabled="disabled">${candidates.candidateBlurb}</textarea>

    <textarea rows="2" cols="20" id="candidateCV" name="candidateCV"                                
      disabled="disabled">${candidates.candidateCV}</textarea>
</c:forEach>
<div id="candidateDiv" id="candidateDiv">
    <select name="employee" id="employee">
        <option value="default" selected="selected">Select Employee</option>
        <c:forEach items="${employees}" var="employee">
            <option value="${employee.id}" id="${employee.id}">
                ${employee.employeeName}- ${employee.employeeCV}<
            /option>
        </c:forEach>
    </select>   
    <textarea rows="3" cols="40" id="candidateBlurb"                
      name="candidateBlurb">BLURB</textarea>
    <div id="employeeCv"></div>
    <input type="submit" value="Add Candidate" />
</div>
</form:form>

上面的表格首先显示员工列表,当用户选择员工时,输入blurb并点击添加候选按钮,我将数据带到控制器。

控制器:

@RequestMapping(value = "{id}/empl", method = RequestMethod.POST)
public String getEmployeeDetails(
    @ModelAttribute("candidateAddAttribute") @Valid List<Candidate> candidates,
    BindingResult result, @PathVariable("id") int requestId, Model model) {

        //implementation goes here
}

在这种情况下如何实现List?提前谢谢。

编辑部分 我尝试发送2个候选人的详细信息,firebug正确发送它像 - 参数 candidateBlurb BLURB sar candidateBlurb BLURB dann 员工1 员工2

所以它可能是我使用的initBinder中的一个问题, binder.registerCustomEditor(Employee.class,                 new PropertyEditorSupport(){                     public String getAsText(){                         return Long.toString(((Employee)getValue())。getId());                     }

                public void setAsText(final String text) {
                    Employee employee = Employee.findById(Integer
                            .parseInt(text));
                    setValue(employee);
                }
            });

一次只需要1个员工的详细信息。这是一个问题???

3 个答案:

答案 0 :(得分:5)

创建一个POJO类,其中包含List作为属性,例如

public class EmployeeForm {
     private List<Candidate> candidates;
     public List<Candidate> getCandidates() { ... }
     public void setCandidates(List<Candidates>) { ... }
}

并在@RequestMapping方法的签名中使用它,而不是直接使用List<Candidate>

你得到的错误信息是Spring抱怨它不知道如何实例化List接口,以便Spring将表单中的请求参数绑定到它。您想提供一个简单的表单/命令类来将表单参数数据绑定到,Spring知道如何从那里处理列表。

答案 1 :(得分:0)

你可以试试这个:

List<Candidate> candidates = ListUtils.lazyList(new ArrayList<Candidate>(),FactoryUtils.instantiateFactory(Candidate.class));

答案 2 :(得分:0)

我遇到了同样的问题,一半的字段绑定正确,一半不是。我注意到没有正确绑定的一半(因此在控制器中给我NULL)被包裹在DIV中。

当我将这些字段移到DIV,宾果游戏之外时,它们在控制器中被正确绑定。

我发现你在DIV中也包含了一些字段,我建议将它们移出并查看它们是否对控制器可见。