3

Spring 3.0 MVC と @ModelAttribute アノテーション付きメソッド パラメータについて明確にする必要があります。次のようなコントローラーがあります。

RequestMapping(value = "/home")
@Controller
public class MyController {

 @RequestMapping(method = RequestMethod.GET)
 public ModelAndView foo() {

               // do something
 }

@RequestMapping(method = RequestMethod.POST)
public ModelAndView bar(
        @ModelAttribute("barCommand") SomeObject obj) {

                    // do sometihng with obj and data sent from the form
}


}

私のhome.jspには、彼のデータをMyControllerのRequestMethod.POSTメソッドに送信するこのようなフォームがあります

<form:form  action="home"  commandName="barCommband">

</form:form

home.jsp にアクセスしようとすると、次の例外が発生します。

java.lang.IllegalStateException:
Neither BindingResult nor plain target object for bean name 'barCommand' available as  request attribute

これを解決するには、追加する必要があることがわかりました

@ModelAttribute("barCommand") SomeObject obj 

そのメソッドでobjを使用しない場合でも、MyControllerのRequest.GETメソッドへのパラメーター。たとえば、次のように別の commandName を使用して別のフォームを home.jsp に追加するとします。

<form:form  action="home/doSomething"  commandName="anotherCommand">

</form:form

また、RequestMethod.GET にそのパラメーターを追加する必要があります。これは次のようになります。

@RequestMapping(method = RequestMethod.GET)
 public ModelAndView foo( @ModelAttribute("barCommand") SomeObject obj1,
  @ModelAttribute("anotherCommand") AnotherObj obj2) {

               // do something
 }

または、同じ例外が発生します。私が求めているのは、これが通常の Spring 3 MVC の動作なのか、それとも何か間違っているのかということです。RequestMethod.GET メソッドにすべての @ModelAttribute パラメータを配置する必要があるのはなぜですか?

助けてくれてありがとう

ステファノ

4

1 に答える 1

3

これが春のmvcリファレンスです。簡単に調べたところ、2つのアプローチが見つかりました。

  1. @InitBinder
  2. メソッドを使用した @ModelAttribute("bean_name")。

first を使用してデータ バインディングをカスタマイズし、コマンド オブジェクトをオンザフライで作成できます。次に、メソッドに注釈を付けて、この名前でモデル属性を事前設定できます。

@ModelAttribute("bean_name")
public Collection<PetType> populatePetTypes() {
    return this.clinic.getPetTypes();
} 

null の場合、「bean_name」という名前のモデル属性が設定されることを願っています。

于 2011-11-18T10:08:33.760 に答える