2011-11-09 7 views
2

私は@ModelAttributeSpringから文書での例以下の理解を助ける必要があります:私は、我々のモデルオブジェクトが全体現在のコントローラに得ることができる。このような追加的な「価値」undestoodいます(法populatePetTypes()@ModelAttributeの権利を理解しましたか?

@Controller 
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit") 
@SessionAttributes("pet") 
public class EditPetForm { 

    // ... 

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

    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(
      @ModelAttribute("pet") Pet pet, 
      BindingResult result, SessionStatus status) { 

     new PetValidator().validate(pet, result); 
     if (result.hasErrors()) { 
      return "petForm"; 
     } 
     else { 
      this.clinic.storePet(pet); 
      status.setComplete(); 
      return "redirect:owner.do?ownerId=" + pet.getOwner().getId(); 
     } 
    } 

} 

。本当ですか?

私は自分のコントローラにそのコードを追加することによって、いくつかのテストを行うにしようとしています:

@ModelAttribute("user") 
public Integer getKod(){ 
    return new Integer(123321); 
} 

別の方法は次のとおりです。

@RequestMapping("/register") 
public String register(Map<String, Object> map, @ModelAttribute("user") MyUser user, BindingResult result) { 
... 
} 

、今私はちょうど私に「KOD」と表示してみてくださいよ形式:

<form:form method="post" action="" commandName="user"> 
(...) 
     <form:label path="kod">kod</form:label>: 
     <form:input path="kod"/> 
(...) 
</form:form> 

が、私が得た:

java.lang.IllegalArgumentException: [email protected]

助けてください!

答えて

3

アノテーションは、配置場所によって異なることを意味します。

@ModelAttributeメソッドでは、メソッドのreturn vlaueをその名前のMapに配置するようにSpringに指示します。そのオブジェクトに対してプロパティのバインドを実行するように指示していません。そこで、あなたは "user"というIntegerをMapに入れます。

@ModelAttributeは、「この名前のマップで何かを見つけて、このメソッドのパラメータに割り当てます」と伝えます。

マップに「user」という名前でIntegerを配置してから、MyUser型のオブジェクトに割り当てるようにSpringに依頼します。もちろん、IntegerはMyUserにキャストできません!

MyUserである古典的なMVCの意味で「モデル」を混乱させていると思います。これは、SpringのModelMap()です。ビューの一部として利用できるデータのすべてです。 Springコントローラが 'Model'を参照するときは、画面の構築に関連するすべてのもののModelMapを意味します。 MyUserオブジェクトはそのマップ内の1つのエントリですが、そこには画面の一部である他のものもあります。 Spring-eseでは、フォームの実際のバインディングターゲットであるため、MyUserを「Form Backing Object」と呼ぶことがよくあります。

たとえば、投稿したスニペットでは、PetTypesの「種類」リストはSpring ModelMapの一部です。ビューを構築するために必要な参照データです。しかし、それはフォームのバッキングオブジェクトである 'ペット'オブジェクトの属性ではありません。

+0

私の "モデル"が紛らわしいのは間違っていました...今は "ユーザー"を "kod"に変更しましたが、 '$ {kod} "、それでもまだ動作しない理由は分かりますか? – Maxiq

+0

どのようなアプリサーバーとバージョンですか?それは実際にjsp-2.0ですか? – Affe

+0

バージョン1.1.2でjstlとtaglibsを使用しています。私のサーバーはtomcat 6です。 – Maxiq

関連する問題