いくつかのデータを送信するページがあります。送信されたフィールドには 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(...);
}
次のように変更するハンドラー メソッドでは、両方のモデル属性 (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()
}
これはなぜですか、どうすれば停止できますか?
リクエストに含まれるものと一致するプロパティ名を持つすべてのモデルではなく、コマンドのみをリクエスト送信データにバインドする必要があります。