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(...); 
}

次のように変更するハンドラー メソッドでは、両方のモデル属性 (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()
}

これはなぜですか、どうすれば停止できますか?

リクエストに含まれるものと一致するプロパティ名を持つすべてのモデルではなく、コマンドのみをリクエスト送信データにバインドする必要があります。

4

1 に答える 1

1

@ModelAttributeアノテーションの 2 つの異なるユースケースを混在させているようです。

注釈付きメソッドのパラメーターに注釈を付けるために使用すると@RequestMapping、この注釈はリクエストパラメーターを注釈付きメソッド引数にバインドします (この場合、該当するリクエストパラメーターを両方のオブジェクトにバインドします)。

一方、一部のデータをモデル属性としてビューに公開する場合は、既に行ったように、FooBarインスタンスのアクセサー メソッドに で注釈を付けるだけで十分です。ただし、要求処理メソッドのパラメーターに@ModelAttribute含める必要はありません (含めるべきではありません) 。これは、そのタイプが受信モデル属性を参照し、送信モデル属性を参照しないためです。FooBar@ModelAttribute

JavaDoc for@ModelAttributeは、区別を非常に明確にしています。

RequestMapping アノテーション付きハンドラー メソッドの対応するパラメーターにアノテーションを付けることにより、特定の属性名を使用して、コマンド オブジェクトを Web ビューに公開するために使用できます。

また、RequestMapping アノテーション付きハンドラー メソッドに基づくコントローラー クラスのアクセサー メソッドにアノテーションを付けることにより、参照データを Web ビューに公開するために使用することもできます。このようなアクセサー メソッドは、RequestMapping がハンドラー メソッドに対してサポートする任意の引数を持つことができ、モデル属性値を返します。暴露する。

于 2011-07-10T17:04:59.973 に答える