2012-01-10 76 views
6

Iam是SpringMVC REST概念的新成員。需要來自這裏的專家的幫助來理解/解決以下問題, 我開發了一個SpringMVC應用程序,下面是控制器類代碼的一部分,它的工作方式非常好,這意味着它可以與JSON類型一起工作對象,REST應用程序的RequestBody

@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中看起來像

<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"/> 

我的問題是如何使之正常POST請求的工作,我的控制器不應該接受JSON類型的對象,而不是它應該適用於普通的HTTP POST變量。 如何從請求中獲取值?我應該爲此做些什麼修改。我需要擺脫的

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

,而是需要添加的方式來創建

CreateNewUserRequest

類的一個實例,通過調用它的構造。爲此,我需要從請求中獲取值。我怎麼做?我可以將@RequestBody字符串有效載荷作爲地圖並獲取值嗎?或者有沒有一種特定的方式來從HTTP POST方法的請求中獲取值?下面的值將在該請求,

名字,姓氏,電子郵件,密碼

回答

10

您在這裏混合兩個概念。在Spring MVC的REST服務是更優雅的彈簧手柄JSON/XML編組爲您提供:

@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(通過JAXB)。

但是通過表單發送的數據是非常不同的。我建議建立第二映射處理不同的媒體類型:

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

利用這種配置REST調用與Content-type=application/json將被路由到第一個方法和形式POST請求到第二個(至少在理論上,還沒有嘗試過)。請注意,與原始@RequestParam註釋相比,Spring中有更簡單的方式處理表單數據,請參閱:Pass a request parameter in Spring MVC 3

+0

感謝托馬日,這真的幫助了,但是小錯誤這個 '@RequestParam( 「formParam1」)formParam1:字符串' 爲 '@RequestParam( 「formParam1」)字符串formParam1' – bluelabel 2012-01-11 04:58:57

+0

@bluelabel :謝謝,修正。太多的斯卡拉:-)。順便說一句,你可以編輯(超過一些聲譽級別)每個問題和答案,就像在wiki中一樣。隨時糾正錯誤! – 2012-01-11 07:43:02

1

OP的確切問題的另一個答案是將consumes內容類型設置爲"text/plain",然後聲明@RequestBody String輸入參數。這將傳遞POST數據的文本作爲聲明的String變量(在下面的示例中爲postPayload)。

當然,這假設你的POST有效載荷是文本數據(正如OP陳述的那樣)。

例子:

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