2012-01-10 13 views
6

SpringMVC RESTコンセプトの新機能です。 私はSpringMVCアプリケーションを開発しました。次はコントローラクラスコードの一部であり、それは完全に正常に動作します。つまり、JSON型で正常に動作することを意味します。オブジェクト、私の問題は、私はそれが通常のPOSTリクエストのために働く作るのですか、私のコントローラの代わりにJSON型オブジェクトを受け入れるべきではない方法です RESTアプリケーションのRequestBody

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 

<bean id="jsonViewResolver" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 


<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
     <property name="supportedMediaTypes" value="application/json" /> 
</bean> 

<bean name="UserController" class="com.tap.mvp.controller.UserController"/> 

よう

@RequestMapping(method = RequestMethod.POST, value = "/user/register") 
public ModelAndView addUser(@RequestBody String payload) { 

    try{ 

     ObjectMapper mapper = new ObjectMapper(); 
     CreateNewUserRequest request = mapper.readValue(payload, CreateNewUserRequest.class); 

     UserBusiness userBusiness = UserBusinessImpl.getInstance(); 
     CreateNewUserResponse response = userBusiness.createNewUser(request); 


     return new ModelAndView(ControllerConstant.JASON_VIEW_RESOLVER, "RESPONSE", response); 

と、これは私の残りの部分-servlet.xmlですが見えますそれは通常のHTTP POST変数で動作するはずです。 リクエストから値を取得するにはどうすればよいですか?私は

ObjectMapper mapper = new ObjectMapper(); 
     CreateNewUserRequest request = mapper.readValue(payload, CreateNewUserRequest.class); 

を取り除き、代わりにそのコンストラクタを呼び出すことによって、

CreateNewUserRequest

クラスのインスタンスを作成する方法を追加する必要がありますする必要があります。そのために私は要求から値を取得する必要があります。それ、どうやったら出来るの? @RequestBody Stringペイロードを地図として扱い、値を取得できますか?またはHTTP POSTメソッドのリクエストから値を取得する特定の方法はありますか?次の値は、要求の中であなたがここに二つの概念を混合さ

のfirstName、lastNameの、電子メール、パスワード

答えて

10

になります。

@RequestMapping(
     headers = {"content-type=application/json"}, 
     method = RequestMethod.POST, value = "/user/register") 
@ResponseBody 
public CreateNewUserResponse addUser(@RequestBody CreateNewUserRequest request) { 
     UserBusiness userBusiness = UserBusinessImpl.getInstance(); 
     return userBusiness.createNewUser(request); 
} 

お知らせ@ResponseBody注釈:春はあなたのためのマーシャリングをJSON/XMLを扱うようSpring MVCのでRESTサービスは、はるかにエレガントです。ビューリゾルバと手動JSONマーシャリングは必要ありません。そして、JAXB経由でXMLを無料で入手できます。

しかし、POST形式で送信されるデータは非常に異なります。 Content-type=application/jsonが第二1に第一の方法とフォームのPOSTリクエストをにルーティングされますと呼び出します(少なくとも理論的には、それを試していないが、この構成RESTで

@RequestMapping(
     headers = {"content-type=application/x-www-form-urlencoded"}, 
     method = RequestMethod.POST, value = "/user/register") 
public ModelAndView addUser(@RequestParam("formParam1") String formParam1) { 
    //... 
} 

:私は、異なるメディアタイプを扱う第2のマッピングを作成することをお勧め)。生の@RequestParam注釈と比較して、Springのフォームデータを扱う簡単な方法があります。Pass a request parameter in Spring MVC 3を参照してください。

+0

おかげTomaz、それは本当に助け、しかし、小さなミスこの '@RequestParam( "formParam1")formParam1:string' を 'として@RequestParam( "formParam1")文字列formParam1' – bluelabel

+0

@bluelabel :ありがとう、固定。 Scalaが多すぎます:-)あなたはwikiのようにここでのすべての質問と回答を編集することができます(評判レベルを超えています)。気をつけて間違いを修正してください! –

1

OPの正確な質問に対するもう1つの回答は、consumesコンテンツタイプを"text/plain"に設定し、@RequestBody String入力パラメータを宣言することです。これにより、宣言されたString変数(次の例ではpostPayload)としてPOSTデータのテキストが渡されます。

もちろん、これはあなたのPOSTペイロードがテキストデータであることを前提としています(OPの場合と同じです)。

例:

@RequestMapping(value = "/user/register", method = RequestMethod.POST, consumes = "text/plain") 
    public ModelAndView addUser(@RequestBody String postPayload) {  
     // ...  
    } 
関連する問題