【问题标题】:Cannot pass list of objects to controller无法将对象列表传递给控制器
【发布时间】:2015-12-04 20:55:35
【问题描述】:

我有两个关系为

的实体
@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";
} 

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

【问题讨论】:

  • 您的表单中控制器的Request mapping 在哪里?您是通过GET 方法还是POST 方法发送表单?
  • @VigNesh 我已经更新了问题,请看一下。

标签: java spring jsp spring-mvc


【解决方案1】:

您的绑定输入表单字段与您的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";
}

然后您再次重定向到“/foos-list”到您的控制器中。您的帖子中没有这样的RequestMapping。所以像这样重定向到适当的RequestMapping

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2016-03-07
    • 2017-01-11
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多