복붙노트

[SPRING] Spring + REST 웹 서비스로 @RequestBody 또는 @ModelAttribute

SPRING

Spring + REST 웹 서비스로 @RequestBody 또는 @ModelAttribute

스프링 3.1과 함께 iPhone 및 Android 용 Restful 웹 사이트 및 웹 서비스를 만들고 있습니다. 내 응용 프로그램에서는 JSON을 Java 객체로 변환하는 데 Spring Message Convertors (org.springframework.http.converter.json.MappingJacksonHttpMessageConverter)를 사용하고 그 반대도 마찬가지입니다.

아래 @ModelAttribute의 도움으로 JSP에서 컨트롤러로 객체 바인딩을위한 Spring form 태그를 사용하고 있습니다.

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

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

그러나 데이터가 iPhone / Android 앱에서 게시되고 그 결과가 다음과 같은 경우에도 동일하게 작동하지 않습니다.

그래서이 문제를 극복하기 위해 @ModelAttribute 대신 @RequestBody 주석을 사용했습니다.

그래서 내 컨트롤러는 다음과 같습니다.

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

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

그것은 그 때 작동하고 나가 얻은 결과는이다 :

그러나 @RequestBody는 JSP 페이지에서 스프링 폼을 사용하지 못하고 데이터가 객체로 변환되지 않고 null 값을 얻습니다.

편집하다:

Bean 클래스 대신 String을 쓰는 동안 아래와 같이 일반 텍스트의 형태로 내용을 가져올 수 있습니다.

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

웹 페이지 호출 결과 :

웹 서비스 호출을 사용하는 iPhone의 결과 (** JSON에서) **

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

하지만 문제는이 접근법을 사용하여 자바 객체로 JSON 문자열을 수동으로 구문 분석해야한다는 것입니다. 그리고 웹 페이지 콘텐츠에서 나는 내가 원하지 않는 값을 수동으로 찾아야 만합니다.

도와주세요.

문안 인사,

아룬 쿠마르

해결법

  1. ==============================

    1.@ModelAttribute가 양식 게시 매개 변수에서 바인딩되고 @RequestBody가 Json 변환기로 직접 본문을 전달하기 때문에 미안하지만 방법이 있다고 생각하지 않습니다. 스프링 폼 태그를 간단한 json 포스트로 대체 할 수는 있지만 두 개의 @RequestMapping 메소드를 갖는 것보다 덜 편리합니다.

    @ModelAttribute가 양식 게시 매개 변수에서 바인딩되고 @RequestBody가 Json 변환기로 직접 본문을 전달하기 때문에 미안하지만 방법이 있다고 생각하지 않습니다. 스프링 폼 태그를 간단한 json 포스트로 대체 할 수는 있지만 두 개의 @RequestMapping 메소드를 갖는 것보다 덜 편리합니다.

  2. ==============================

    2.그것의 @RequestBody. @RequestMapping을 사용하여 출력으로 기대하고 생성하는 MIME 형식을 지정하는 것이 좋습니다.

    그것의 @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>
    
  3. from https://stackoverflow.com/questions/13229584/requestbody-or-modelattribute-with-springrest-web-services by cc-by-sa and MIT license