objeto mvc jsonview deserialize databind convertir convert java json spring-mvc jackson

java - jsonview - jackson spring mvc



Analizando json en objetos java en spring-mvc (2)

Estoy familiarizado con cómo devolver json desde mis métodos @Controller utilizando la anotación @ResponseBody .

Ahora trato de leer algunos argumentos json en mi controlador, pero hasta ahora no he tenido suerte. Aquí está la firma de mi controlador:

@RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {

Pero cuando trato de invocar este método, Spring se queja de que: Failed to convert value of type ''java.lang.String'' to required type ''com.foo.SearchRequest''

La eliminación de la anotación @RequestBody no parece marcar la diferencia.

Analizar manualmente el json funciona, por lo que Jackson debe estar en el classpath:

// This works @RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestParam("json") String json) { SearchRequest request; try { request = objectMapper.readValue(json, SearchRequest.class); } catch (IOException e) { throw new IllegalArgumentException("Couldn''t parse json into a search request", e); }

¿Algunas ideas? ¿Estoy tratando de hacer algo que no es compatible?


Su parámetro debe ser @RequestParam o @RequestBody , no ambos.

@RequestBody es para usar con solicitudes POST y PUT, donde el cuerpo de la solicitud es lo que quiere analizar. @RequestParam es para parámetros con nombre, ya sea en la URL o como un envío de formulario de varias partes.

Por lo tanto, debe decidir cuál necesita. ¿Realmente quieres tener tu JSON como parámetro de solicitud? Normalmente, no es así como funciona AJAX, normalmente se envía como el cuerpo de la solicitud.

Intente eliminar @RequestParam y vea si eso funciona. De lo contrario, y realmente está publicando el JSON como un parámetro de solicitud, Spring no lo ayudará a procesarlo sin una instalación adicional (consulte Personalización de la inicialización de WebDataBinder ).


si está utilizando jquery en el lado del cliente, esto funcionó para mí:

Java:

@RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestBody SearchRequest json) {

Jquery (necesitas incluir json2.js de Douglas Crockford para tener la función JSON.stringify):

$.ajax({ type: "post", url: "sync", //your valid url contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me) data: JSON.stringify(jsonobject), //json object or array of json objects success: function(result) { //do nothing }, error: function(){ alert(''failure''); } });