我有一个提交一些数据的页面。提交的字段包括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
属性的所有模型属性)。例如,像:
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(...);
}
在我的处理程序方法中,我修改如下所示,绑定发生在两个模型属性(cmd
和fooBar
)上:
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()
}
为什么会这样,我怎么能阻止它?
我只希望我的命令与请求提交的数据绑定,而不是每个具有匹配属性名称的模型与请求中的内容绑定。
答案 0 :(得分:1)
您似乎混合了@ModelAttribute
注释的两个不同用例。
当它用于注释@RequestMapping
带注释方法的参数时,此注释会将请求参数绑定到带注释的方法参数(在您的情况下,它会将适用的请求参数绑定到您的对象)。 / p>
另一方面,如果您想将某些数据作为模型属性公开给视图,那么就像使用FooBar
一样注释@ModelAttribute
实例的访问者方法就足够了。但是您不需要(也不应该)在请求处理方法参数中包含FooBar
,因为@ModelAttribute
类型指的是传入而不是传出模型属性。
JavaDoc for @ModelAttribute
区分非常明确:
可以使用特定的属性名称,通过注释RequestMapping带注释的处理程序方法的相应参数,将命令对象公开给Web视图。
还可以通过在控制器类中注释访问器方法来将引用数据暴露给Web视图,该控制器类基于RequestMapping带注释的处理程序方法,允许这样的访问器方法具有RequestMapping支持处理程序方法的任何参数,返回要公开的模型属性值。