【问题标题】:@RequestBody or @ModelAttribute with Spring+REST web services带有 Spring+REST Web 服务的 @RequestBody 或 @ModelAttribute
【发布时间】:2012-11-05 09:52:21
【问题描述】:

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

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

我在@ModelAttribute 的帮助下使用 Spring 表单标签 将对象绑定从 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());
}

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

收到的数据==一些数据;

但是 @RequestBody 然后不适用于 JSP 页面上的 spring 表单,并且数据没有转换为对象,我得到了 null 值。

  1. 我不能使用@RequestBody 注释以 JSON 的形式发布数据吗 带有来自 JSP 页面的 spring 表单标签??
  2. 有什么方法可以将我的 JSP 表单中的数据发布为 以及通过仅使用单个控制器方法(@ModelAttribute 或 @RequestBody)从我的电话应用程序。

编辑:

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

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

网页调用结果:

uid=11&confirmPassword=somepassword&newPassword=somepassword

来自 iPhone 使用 Web 服务调用的结果(在 **JSON 中)**

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

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

请帮忙。

问候,

阿伦库马尔

【问题讨论】:

    标签: spring rest spring-mvc


    【解决方案1】:

    对不起,但我不相信有办法,因为@ModelAttribute 是从表单发布参数绑定的,@RequestBody 将正文直接传递给 Json 转换器。您可以用一个简单的 json 帖子替换 spring 表单标签,但这可能不如拥有两个 @RequestMapping 方法方便。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 现在贬值了。现在不需要处理程序
      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      相关资源
      最近更新 更多