带有Spring + REST Web服务的@RequestBody或@ModelAttribute

时间:2012-11-05 09:52:22

标签: spring rest spring-mvc

我正在使用 Spring 3.1 为iPhone和Android应用创建一个Restful网站和Web服务。在我的应用程序中,我使用Spring Message Convertors(org.springframework.http.converter.json.MappingJacksonHttpMessageConverter)将JSON转换为Java对象,反之亦然。

  

我的目标是应该只有一个控制器   JSP页面应该使用的方法(相同的URL),Iphone / Andois app。

我正在使用 Spring表单标记,在@ModelAttribute的帮助下,从JSP到控制器的对象绑定,如下所示。

@RequestMapping(value = "reset-password", method = RequestMethod.POST)
public ModelAndView resetPassword(@ModelAttributeForgot forgotPassword,
     HttpServletRequest request) { 

     System.out.println("data recived=="+forgotPassword.getNewPassword());
 }

但如果数据是从iPhone / Android应用程序发布的,结果是:

  

已恢复数据== null;

为了解决这个问题,我在@RequestBody处使用了@ModelAttribute注释。

所以我的控制器如下所示:

@RequestMapping(value = "reset-password", method = RequestMethod.POST)
public ModelAndView resetPassword(@RequestBody Forgot forgotPassword,
    HttpServletRequest request) { 

    System.out.println("data recived=="+forgotPassword.getNewPassword());
}

它起作用,我得到的结果是:

  

已收回数据== somedata;

但是@RequestBody然后不能在JSP页面上使用spring表单,并且数据不会转换为对象而且我得到了null个值。

  1. 我不能使用@RequestBody注释以JSON的形式发布数据 使用JSP页面的spring form标签??
  2. 有什么方法可以使用我可以从我的JSP表单中发布数据 以及通过仅使用一个控制器方法(@ModelAttribute或@RequestBody)从我的手机应用程序。
  3. 编辑:

    在编写String代替Bean类时,我能够以纯文本的形式获取内容,如下所示:

    @RequestMapping(value = "reset-password", method = RequestMethod.POST)
    public ModelAndView resetPassword(@RequestBody String string,
         HttpServletRequest request) { }
    

    来自网页调用的结果:

      

    UID = 11&安培; confirmPassword = somepassword&安培; NEWPASSWORD = somepassword

    iPhone使用网络服务电话的结果(** JSON )**

    {"newPassword":"somepassword","confirmPassword":"somepassword","uid":"11"}
    

    但问题是使用这种方法我必须手动将JSON字符串解析为Java对象。在网页内容中,我必须手动找到我不想要的值。

    请帮忙。

    此致

    Arun Kumar

2 个答案:

答案 0 :(得分:3)

很抱歉,但我不相信有办法,因为@ModelAttribute是从表单发布参数绑定的,而@RequestBody将正文直接传递给Json转换器。你可以用一个简单的json post替换spring form标签,但这可能不如使用两个@RequestMapping方法那么方便。

答案 1 :(得分:0)

它的@RequestBody。我觉得最好指定你期望的mime类型并使用@RequestMapping作为输出生成,

  @RequestMapping(value="/authenticate",produces="application/json",   
consumes="application/json",method=RequestMethod.POST)

然后使用AnnotationMethodHandlerAdapter

注册相应的消息转换器

此消息转换器负责编组&解组您的请求&基于产品和响应的响应实体消耗属性。

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
     <property name="order" value="1" />
         <property name="messageConverters">
         <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >

                 <property name="supportedMediaTypes" value="application/json"/>
            </bean>
            <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
            </bean>
         </list>
    </property>
</bean>