无法将对象列表传递给控制器

时间:2015-09-09 02:57:19

标签: java spring jsp spring-mvc

我有两个关系为

的实体
@Entity
public class Foo {


    @Id
    @GeneratedValue
    private Integer id;

    private String name;     

    @OneToMany(mappedBy = "foo")
    private List<Bar> bars;

    // *******************\\    
}

@Entity
public class Bar{

    @Id
    @GeneratedValue
    private Integer id;

    private String title;

    @ManyToOne
    @JoinColumn(name = "foo_id")
    private Foo foo;

    // *******************\\

}

我获取了用于添加新foo

的表格列表
@RequestMapping(value = "/add-foo", method = RequestMethod.GET)
    public String fooForm(Model model) {
        model.addAttribute("bars", barService.findAll());
        return "add-foo";
    } 

和表单是

<form:form commandName="foo">
    <form:input path="name"/><br>
    <form:select path="bars" multiple="multiple">
    <c:forEach items="${bars}" var="bar">
        <form:option value="${bar.id}">${bar.title}</form:option>
    </c:forEach>
    </form:select><br>
    <input type="submit" value="Add Foo with selected Bars">
</form:form>

在这里,我看到使用

显示所有条形图
<c:forEach items="${bars}" var="bar">
   <form:option value="${bar.id}">${bar.title}</form:option>
</c:forEach>

但是当我提交表单时,使用控制器中的方法

@RequestMapping(value = "/add-foo", method = RequestMethod.POST)
public String addFoo(@ModelAttribute("foo") Foo foo) {

    List<Bar> bars = foo.getBars();
    for (Bar bar : bars ) {
        logger.info("DEBUG Foo object", bar);
    }
    return "redirect:/foos-list";
} 

似乎没有向服务器发送数据并说出错误客户端发送的请求在语法上是不正确的

1 个答案:

答案 0 :(得分:0)

您的Business Domain model Object绑定输入表单字段,确保正确执行数据绑定。所以在@ModelAttribute之后使用BindingResult。因此,您可以轻松识别表单字段是否与业务对象绑定。

@RequestMapping(value = "/add-foo", method = RequestMethod.POST)
public String addFoo(@ModelAttribute("foo") Foo foo, BindingResult result) {

 if (!result.hasErrors()){

    List<Bar> bars = foo.getBars();
    for (Bar bar : bars ) {
        logger.info("DEBUG Foo object", bar);
    }
  } else 
      System.out.println("Binding result error");

    return "redirect:/foos-list";
}

您的重定向到&#34; / foos-list&#34;再次进入你的控制器。您的帖子中没有此类RequestMapping。因此,重定向到相应的RequestMapping

    @RequestMapping(value = "/foos-list", method = RequestMethod.GET)
    public String fooForm(Model model) {
        model.addAttribute("bars", barService.findAll());
        return "add-foo";
    }