entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Hola, llevo unos días intentando enviar un objeto JSON a un controlador en Spring y que éste lo convierta a un objeto del modelo para poder almacenarlo en la base de datos. Sin embargo, al hacer el envío de este objeto JSON al controlador, obtengo como respuesta un error 400.

Éste es el controlador:

    @RequestMapping(value = "/save", consumes="application/json", method = RequestMethod.POST)
public String save(@RequestBody Servicio servicio) {
    System.out.println("Nombre: " + servicio.getNombreServicio());
    System.out.println("Descripción: " + servicio.getDescripcion());

    if(servicio.getNombreServicio()!=null){          
        try {
            servicioDAO.save(servicio);
        } catch(Exception e) {
            e.printStackTrace();
        }
        return "ok";
    }
    return "bad";
}

Éste es el test que realiza la petición y obtiene el error 400:

@Test
public void testSave() {
     try {

            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost postRequest = new HttpPost(urlBase+"servicio/save");

            StringEntity input = new StringEntity("{\"nombre\":\"servicio 3\",\"descripcion\":\"descripcion del servicio 3\"}");
            input.setContentType("application/json");
            postRequest.setEntity(input);

            HttpResponse response = httpClient.execute(postRequest);

            String responseSrt = EntityUtils.toString(response.getEntity());
            System.out.println(responseSrt);

            assertTrue(response.getStatusLine().getStatusCode() == 201);
        } catch(Exception e){
            e.printStackTrace();
            fail();
        }
}

Espero que alguien pueda ayudarme. Un saludo y gracias de antemano.

2 Respuestas

1voto

JorgeMR Puntos270

Bien, solucionado, me autocontesto por si a alguien le sirve de ayuda.

Había varios problemas que se resumen en uno: el JSON estaba mal construido.

Desde el test (código de arriba) hacía lo siguiente:

StringEntity input = new StringEntity("{\"nombre\":\"servicio 3\",\"descripcion\":\"descripcion del servicio 3\"}");

a ese objeto le faltan atributos.

Por otra parte, usé la clase RestTemplate de Spring for Android para enviar el JSON desde un dispositivo móvil pero, al hacer el POST, estaba incluyendo el ID del objeto que quería almacenar.

¡Saludos!

1voto

jaimeph Puntos280

Hola,

creo que la forma más cómoda sería usando la librería Jackson y quedaría así:

@RequestMapping(value = "/save", consumes="application/json", method = RequestMethod.POST)
public String save(@RequestBody String body) {
    Servicio servicio = (Servicio) new ObjectMapper().readValue(body, Servicio.class);
    System.out.println("Nombre: " + servicio.getNombreServicio());
    System.out.println("Descripción: " + servicio.getDescripcion());

Nota: El código es orientativo y faltaría el control de las excepciones en la conversión del JSON.

Aunque si mal no recuerdo, Spring permitía la conversión automática de JSON a Objecto pero había que definir algunos parámetros en el contexto de las peticiones REST.

Un saludo,

1voto

JorgeMR comentado

Muchas gracias por tu rápida respuesta pero sigo teniendo el mismo problema. He probado tu solución y sigo obteniendo el error 400.

Según he leído con la anotación @RequestBody y con la librería Jackson correctamente incluida en el proyecto sería suficiente para que, de forma automática, Spring te convierta los datos que llegan en formato JSON a un objeto del modelo, pero, por el contrario, obtengo como respuesta el error 400. ¿Alguna idea?

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta