2012-01-10 7 views
6

Iam es un concepto nuevo de SpringMVC REST. Necesito la ayuda de expertos aquí para comprender/resolver el siguiente problema, He desarrollado una aplicación SpringMVC, el siguiente es parte de un código de clase de controlador, y funciona perfectamente bien tal como está, lo que significa que funciona bien con el tipo JSON objeto,SolicitudCuadro de una aplicación 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); 

y este es mi descanso servlet.xml parece

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

mi problema es ¿Cómo puedo hacer que funcione para solicitud POST normal, mi controlador no debe aceptar tipo de objeto en lugar de JSON debería funcionar para las variables HTTP POST normales. ¿Cómo obtengo los valores de la solicitud? ¿Cuáles son las modificaciones que debo hacer para eso? Necesito para deshacerse de

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

y en lugar de necesitar agregar manera de crear una instancia de

CreateNewUserRequest clase

, invocando su constructor. Para eso necesito obtener valores de la solicitud. ¿Cómo puedo hacer eso? ¿Puedo tratar @RequestBody String payload como un mapa y obtener los valores? o hay una forma específica de obtener los valores de la solicitud del método HTTP POST? los valores siguientes en la solicitud,

nombre, apellido, correo electrónico, contraseña

Respuesta

10

Usted está mezclando dos conceptos aquí. El servicio REST en Spring MVC es mucho más elegante que la primavera se encarga de JSON/XML cálculo de referencias para usted:

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

Aviso @ResponseBody la anotación. No necesita ningún resolvedor de vistas ni clasificación manual JSON. Y obtienes XML (a través de JAXB) gratis.

Sin embargo, los datos enviados a través del formulario POST son muy diferentes. Yo sugeriría la creación de segundo mapeo manejo de diferentes tipo de medio:

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

Con esta configuración REST llamadas con Content-type=application/json serán enviados a primer método y la forma de la POST peticiones a la segunda (al menos en teoría, no lo han intentado) Tenga en cuenta que hay formas más simples de manejar los datos del formulario en Spring en comparación con la anotación raw @RequestParam, consulte: Pass a request parameter in Spring MVC 3.

+0

Gracias Tomaz, Realmente me ayudó, sin embargo este pequeño error '@RequestParam ("formParam1") formParam1: String' como '@RequestParam ("formParam1") Cadena formParam1' – bluelabel

+0

@bluelabel : Gracias, arreglado. Demasiado Scala :-). Por cierto, puedes editar (por encima de cierto nivel de reputación) cada pregunta y respuesta aquí, como en wiki. ¡Siéntase libre de corregir errores! –

1

Otra respuesta a la pregunta exacta del OP es establecer el tipo de contenido consumes en "text/plain" y luego declarar un parámetro de entrada @RequestBody String. Esto pasará el texto de los datos POST como la variable String declarada (postPayload en el siguiente ejemplo).

Por supuesto, esto supone que su carga de POST es datos de texto (como el OP indica que era el caso).

Ejemplo:

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