2012-01-10 17 views
6

Bit Iam nuovo al concetto REST SpringMVC. Ho bisogno di un aiuto da parte di esperti qui per capire/risolvere il seguente problema, Ho sviluppato un'applicazione SpringMVC, che segue è una parte di un codice di classe controller e funziona perfettamente bene così com'è, il che significa che funziona bene con il tipo JSON oggetto,RequestBody di un'applicazione 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); 

e questo è il mio riposo servlet.xml sembra

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

il mio problema è come faccio a farlo funzionare per normale richiesta POST, il mio controller non dovrebbe accettare il tipo JSON oggetto invece dovrebbe funzionare per le normali variabili HTTP POST. Come ottengo i valori dalla richiesta? Quali sono le modifiche dovrei aver bisogno di essere fatto per quello. Ho bisogno di sbarazzarsi di

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

e invece necessario aggiungere modo per creare un'istanza di

CreateNewUserRequest classe

, invocando il suo costruttore. Per quello ho bisogno di ottenere valori dalla richiesta. Come lo faccio? Posso trattare il carico utile @RequestBody String come una mappa e ottenere i valori? o esiste un modo specifico per ottenere valori dalla richiesta del metodo HTTP POST? seguenti valori saranno nella richiesta,

nome, cognome, e-mail, la password

risposta

10

si stia mescolando due concetti qui. Il servizio REST in Spring MVC è molto più elegante come molla Maniglie JSON/XML smistamento per voi:

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

Avviso del @ResponseBody annotazione. Non hai bisogno di alcun risolutore di vista e manuale di marshalling JSON. E ottieni XML (tramite JAXB) gratuitamente.

Tuttavia i dati inviati tramite il modulo POST sono molto diversi. Vorrei suggerire la creazione di seconda mappatura movimentazione diverso tipo di supporto:

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

Con questa configurazione RESTO telefoniche con Content-type=application/json verrà instradata alle prime richieste di metodo e la forma posta al secondo (almeno in teoria, non hanno provato). Si noti che esistono modi più semplici per gestire i dati dei moduli in primavera rispetto all'annotazione originale @RequestParam, vedere: Pass a request parameter in Spring MVC 3.

+0

Grazie Tomaz, E 'davvero aiutato, per quanto piccolo errore questo '@RequestParam ("formParam1") formParam1: String' come '@RequestParam ("formParam1") String formParam1' – bluelabel

+0

@bluelabel : Grazie, risolto. Troppa Scala :-). A proposito, puoi modificare (sopra un certo livello di reputazione) ogni domanda e risposta qui, come in wiki. Sentiti libero di correggere gli errori! –

1

Un'altra risposta alla domanda esatta dell'OP è impostare il tipo di contenuto consumes su "text/plain" e quindi dichiarare un parametro di input @RequestBody String. Questo passerà il testo dei dati POST come variabile dichiarata String (postPayload nell'esempio seguente).

Naturalmente, questo presuppone che il carico utile POST sia costituito da dati di testo (come indicato dall'OP stesso).

Esempio:

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