RequestBody的REST应用程序

时间:2012-01-10 17:56:46

标签: rest spring-mvc http-post

我对SpringMVC REST概念不熟悉。需要专家的帮助来理解/解决以下问题, 我开发了一个SpringMVC应用程序,以下是控制器类代码的一部分,它的工作方式完全正常,这意味着它可以正常使用JSON类型对象,

@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);

这是我的rest-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 String payload 视为地图并获取值吗?或者是否有一种特定的方法从HTTP POST方法的请求中获取值?以下值将在请求中

  

firstName,lastName,email,password

2 个答案:

答案 0 :(得分:10)

你在这里混合了两个概念。当Spring为您处理JSON / XML编组时,Spring MVC中的REST服务更加优雅:

@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)。

但是,通过表格POST发送的数据非常不同。我建议创建第二个映射处理不同的媒体类型:

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

使用此配置,使用Content-type=application/json的REST调用将路由到第一个方法并向第二个方法形成POST请求(至少在理论上,尚未尝试过)。请注意,与原始@RequestParam注释相比,Spring中处理表单数据的方法更简单,请参阅:Pass a request parameter in Spring MVC 3

答案 1 :(得分:2)

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) {    
        // ...    
    }