Spring 3错误地绑定了所有模型属性的请求数据

时间:2011-07-10 16:02:01

标签: java spring data-binding spring-3

我有一个提交一些数据的页面。提交的字段包括ID参数。

<form:form modelAttribute="command" action="info.html">
  <form:input path="id"/>
  ...
</form:form>

我的comand对象是一个带有id字段的POJO:

public class MyCommand {
    private Integer id;
    public Integer getId() {
       return id;
    }
    public void setId(Integer id) {
       this.id = id;
    }
    ....
}

这在控制器中注释如下:

@ModelAttribute("command")
public MyCommand initializeCommand() {
    return new MyCommand(...);
}

虽然我的处理程序方法看起来像这样:

public void handle(@ModelAttribute("command") MyCommand cmd, ...)

当我提交表单时,Spring会将参数绑定到命令对象。但它还将参数绑定到模型中找到的每个对象(对于具有id属性的所有模型属性)。例如,像:

这样的bean
public class FooBar {
     private Integer id;
     public Integer getId() {
        return id;
     }
     public void setId(Integer id) {
        this.id = id;
     } 
    .... 
}

设置如:

@ModelAttribute("fooBar") 
public FooBar initializeFooBar() {
     return new FooBar(...); 
}

在我的处理程序方法中,我修改如下所示,绑定发生在两个模型属性(cmdfooBar)上:

public void handle(@ModelAttribute("command") MyCommand cmd, 
    @ModelAttribute("fooBar") FooBar fooBar, ...) {
    // when i submit my form the following values are equal: 
    // fooBar.getId() is the same as cmd.getId()
}

为什么会这样,我怎么能阻止它?

我只希望我的命令与请求提交的数据绑定,而不是每个具有匹配属性名称的模型与请求中的内容绑定。

1 个答案:

答案 0 :(得分:1)

您似乎混合了@ModelAttribute注释的两个不同用例。

当它用于注释@RequestMapping带注释方法的参数时,此注释会将请求参数绑定到带注释的方法参数(在您的情况下,它会将适用的请求参数绑定到您的对象)。 / p>

另一方面,如果您想将某些数据作为模型属性公开给视图,那么就像使用FooBar一样注释@ModelAttribute实例的访问者方法就足够了。但是您不需要(也不应该)在请求处理方法参数中包含FooBar,因为@ModelAttribute类型指的是传入而不是传出模型属性。

JavaDoc for @ModelAttribute区分非常明确:

  

可以使用特定的属性名称,通过注释RequestMapping带注释的处理程序方法的相应参数,将命令对象公开给Web视图。

     

还可以通过在控制器类中注释访问器方法来将引用数据暴露给Web视图,该控制器类基于RequestMapping带注释的处理程序方法,允许这样的访问器方法具有RequestMapping支持处理程序方法的任何参数,返回要公开的模型属性值。