2011-07-08 14 views
2

Spring MVCでは、適切な値で埋められるhandler methods with a variety of parametersを定義できます。POJOを使用したSpring MVCおよびハンドラメソッド

同じ方法を使用して、POJOに値を入力してから、ハンドラメソッドに渡すことはできますか?

現在、私がしなければならない。

@RequestMapping 
public ModelMap handle(@RequestParam("user") String user, ...) 

私がやりたいこと:

class HandlerPojo { 
    @RequestParam("user") String user; 
    ... 
} 

@RequestMapping 
public ModelMap handle(HandlerPojo pojo) 

答えて

2

POJO内にSpring @RequestParam注釈がなくても、実際にはかなりシンプルです。あなたが探しているのは、カスタムWebArgumentResolverです。ここでは完全な例である:

@Service 
public class UserArgumentResolver implements WebArgumentResolver { 
    @Override 
    public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception { 
     if (methodParameter.getParameterType() == User.class) { 
      return new User(webRequest.getParameter("user")); 
     } 
     return WebArgumentResolver.UNRESOLVED; 
    } 
} 

コードはかなり自明です:ハンドラのパラメータの一つは、User型である場合、userという名前のリクエストパラメータを取得し、あなたが(もちろん、それはUserに割り当て可能でなければならない欲しいものは何でも返します。WebArgumentResolver.UNRESOLVEDリゾルバは、このパラメータを処理することができなかったとその後のリゾルバが検証されなければならないことを意味し

残念ながらリゾルバは、デフォルトでは取り上げていない、それは登録する必要があります。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="customArgumentResolver" ref="userArgumentResolver"/> 
</bean> 

<mvc:annotation-driven /> 

これだけです!あなたのハンドラは、次のようになります。

@RequestMapping 
public void handle(User user) { 
    //... 
} 
0

これは@RequestMappingは、要求で指定されたパラメータを引っ張り、割り当てされ、可能ではありませんそれらの値をjava変数に追加します。 pojoがクライアント上に存在しないため、要求にpojoを渡すことはできません。たぶんジャソンを渡して、ジャクソンやグソンを使ってポージョにデシリアライズしてみてください。

+0

-1:そうでない場合、SpringはPOJO Beanプロパティの名前に基づいてPOJOにバインドします。 @ JBの答えを見てください。 – skaffman

4

あなたがするリンクのドキュメントは言う:@RequestMappingと に注釈を付けている

ハンドラメソッドは非常に 柔軟なシグネチャを持つことができます。 [...]

  • にパラメータをバインドするコマンドまたは フォームオブジェクト: カスタマイズ型変換で、 Beanプロパティまたはフィールドとして[...]

あなたがすることはできませんPOJOのプロパティ/フィールドで@RequestMappingアノテーションを使用しますが、POJOのプロパティ名がパラメータ名をマップする場合、POJOはインスタンス化され、Springによって適切に設定されます。

+0

+1私は本当にあなたの答えが好きですが、私は普通のユーザーよりも複雑な問題がある傾向があるので、Tomaszの答えは長期的には少し便利です。 –

関連する問題