Estoy familiarizado con cómo devolver un json desde mi @Controller los métodos que utilizan la @ResponseBody anotación.

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

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

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

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

Manualmente analizar el json obras, 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);
    }

Alguna idea? Estoy tratando de hacer algo que no es compatible?

InformationsquelleAutor oksayt | 2010-10-13

2 Comentarios

  1. 44

    El parámetro debe ser una @RequestParam, o un @RequestBody, no tanto.

    @RequestBody es para uso con el POST y PONER las solicitudes, donde el cuerpo de la solicitud es lo que desea analizar. @RequestParam es para los parámetros con nombre, ya sea en la dirección URL o como un formulario multipart presentación.

    Por lo que necesita para decidir cuál es el que usted necesita. ¿Realmente quiere tener su JSON como un parámetro de la petición? Esto no es normalmente cómo AJAX funciona, es que normalmente se envía como el cuerpo de solicitud.

    Pruebe a quitar el @RequestParam y ver si funciona. Si no, y que realmente se están publicando las JSON como un parámetro de la petición, luego de la Primavera no le ayudará proceso que sin necesidad de la tubería (ver Personalización de WebDataBinder de inicialización).

    • +1, me ganó este. Sin embargo, una cosa más para asegurarse de que el cliente establezca la solicitud Content-Type a application/json? Trate de que con @RequestBody, y quitar @RequestParam, como skaffman propuso originalmente.
    • Sólo ahora he quitado el @RequestBody anotación y se envía el parámetro como un parámetro GET: http://localhost:8080/my-app/ajax/search/sync?json={"foo"%3A"bar"} pero me da el mismo error.
    • Como ya he dicho, si usted desea utilizar @RequestParam para el análisis de JSON, vas a tener que personalizar tu enlace de datos, como se describe en el enlace.
    • Ah veo. Ahora he quitado @RequestParam, se añade de nuevo @RequestBody, y ahora estoy enviando el parámetro como una forma de POST (para que el cuerpo del POST es la cadena json con el prefijo json=). Pero sigo obteniendo el mismo error.
    • Usted no necesita la json=, es redundante. Sólo falta que el JSON de texto en el cuerpo. oh, y usted también necesitará <mvc:annotation-driven/> para Jackson apoyo (ver static.springsource.org/spring/docs/3.0.x/…)
    • Gracias por el seguimiento de las respuestas. He comprobado que tengo el <mvc:annotation-driven/> directiva. Para generar un POST como usted la describe, he utilizado TamperData para establecer los datos de envío de mi pedido de solo la url codificada cadena json. Esta vez no me sale el error y mi método de controlador consiguió invoca, sino que el parámetro objeto es nulo.
    • Aunque yo no conseguir trabajo sin embargo, este marcado como correcta, ya que definitivamente señala el problema original correctamente. Gracias!
    • @RequestBody no funciona para GET método

  2. 4

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

    Java:

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

    Jquery (deberá incluir Douglas Crockford del json2.js tener el JSON.stringify de la función):

    $.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');
        }
    });

Dejar respuesta

Please enter your comment!
Please enter your name here