0

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

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

我的命令对象是具有这样一个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()
}

为什么会这样,我该如何阻止它?

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

4

1 回答 1

1

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

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

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

JavaDoc for@ModelAttribute使区别非常清楚:

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

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

于 2011-07-10T17:04:59.973 回答