2012-01-10 15 views
6

Jestem nowy w koncepcji REST SpringMVC. Potrzebujesz pomocy ekspertów tutaj, aby zrozumieć/rozwiązać następujący problem, Opracowałem aplikację SpringMVC, która jest częścią kodu klasy kontrolera i działa poprawnie w taki sposób, w jaki jest, co oznacza, że ​​działa poprawnie z typem JSON obiekt,RequestBody aplikacji REST

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

i to jest mój odpoczynek-servlet.xml wygląda

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

moim problemem jest to, jak mogę zrobić to praca dla zwykłego żądania POST, mój kontroler nie powinien przyjmować typu obiekt JSON zamiast Powinien działać w przypadku normalnych zmiennych HTTP POST. Jak uzyskać wartości z żądania? Jakie modyfikacje należy wymagać do tego celu. muszę się pozbyć

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

a zamiast tego trzeba dodać drogę do utworzenia instancji

CreateNewUserRequest

klasy, wywołując jego konstruktor. W tym celu muszę uzyskać wartości z żądania. Jak mogę to zrobić? Czy mogę traktować @RequestBody String ładunek jako mapę i uzyskać wartości? lub czy istnieje określony sposób uzyskania wartości z żądania metody HTTP POST? Następujące wartości będzie w żądaniu,

imię, nazwisko, e-mail, hasło

Odpowiedz

10

Jesteś tutaj mieszanie dwóch pojęć. Usługa REST w Spring MVC jest znacznie bardziej elegancki jak Wiosna obsługuje JSON/XML rozrządowych dla Ciebie:

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

zauważy @ResponseBody adnotacji. Nie potrzebujesz żadnych rozstrzygających widoków i ręcznego zestawiania JSON. I dostajesz XML (przez JAXB) za darmo.

Jednak dane przesyłane za pomocą formularza POST są bardzo różne. Proponuję stworzenie drugiego mapowanie obsługi różnego rodzaju mediów:

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

przy tej konfiguracji połączeń z REST Content-type=application/json będą kierowane do metod i form POST pierwszych wniosków do drugiej (przynajmniej w teorii, nie próbowałem). Zwróć uwagę, że istnieją prostsze sposoby obsługi danych formularzy na wiosnę w porównaniu do surowej adnotacji @RequestParam, patrz: Pass a request parameter in Spring MVC 3.

+0

Dzięki Tomaz, to naprawdę pomogło, jednak mały błąd ten '@RequestParam ("formParam1") formParam1: String' jako '@RequestParam ("formParam1") String formParam1' – bluelabel

+0

@bluelabel : Dzięki, naprawione. Za dużo Scali :-). BTW możesz edytować (powyżej pewnego poziomu reputacji) każde pytanie i odpowiedź tutaj, jak na wiki. Możesz poprawić błędy! –

1

Kolejną odpowiedzią na dokładne pytanie OP jest ustawienie typu zawartości consumes na "text/plain", a następnie zadeklarowanie parametru wejściowego @RequestBody String. Spowoduje to przekazanie tekstu danych POST jako deklarowanej zmiennej String (postPayload w poniższym przykładzie).

Oczywiście zakłada to, że ładunek POST to dane tekstowe (zgodnie z opisem PO).

Przykład:

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