2010-02-13 21 views
23

configurar mi messageconverter como de Jackson luegoSpring 3.0 haciendo respuesta JSON usando Jackson mensaje convertidor de

class Foo{int x; int y} 

y en el controlador de

@ResponseBody 
public Foo method(){ 
    return new Foo(3,4) 
} 

de ese im esperando para devolver una cadena JSON {x: '3 ', y:' 4 '} del servidor sin ninguna otra configuración. pero conseguir respuesta de error 404 a mi petición ajax

Si el método se anota con @ResponseBody, el tipo de retorno se escribe en el cuerpo de la respuesta HTTP. El valor de retorno se convertirá al tipo de argumento de método declarado utilizando HttpMessageConverters.

¿No funciona? o debería convertir mi Objeto de respuesta a una cadena Json utilizando el serializador y luego devolver esa cadena como respuesta. (Podría hacer las respuestas de cadena correctamente) o debería hacer algunas otras configuraciones? como la adición de anotaciones de clase Foo

aquí está mi conf.xml

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
<property name="messageConverters"> 
    <list> 
    <ref bean="jacksonMessageConverter"/> 
    </list> 
</property> 

+0

bueno mencionar No uso las vistas o r modelmap tengo una js UI – dupdup

+0

por ahora soy la serialización de mis objetos a la cadena y publicar estas cadenas para el cliente – dupdup

+0

pago y envío [aquí] (http://stackoverflow.com/questions/16909742/spring-3-2-0-web -mvc-rest-api-and-json2-post-requests-how-to-get-it-right-onc) si está migrando al nuevo resorte 3.2. – AmirHd

Respuesta

2

un error HTTP 404 sólo significa que el recurso no puede ser encontrado. Eso puede tener 2 causas:

  1. La URL de la solicitud es incorrecta (error del lado del cliente o URL incorrecta en el enlace/botón).
  2. El recurso no está allí donde lo espera (error del lado del servidor).

Para reparar 1, asegúrese de estar utilizando o proporcionando la URL de solicitud correcta (¡sensible a mayúsculas y minúsculas!). Para reparar 2, compruebe los registros de inicio del servidor en busca de errores de inicio y corríjalos en consecuencia.

Todo esto va más allá del código e información publicados.

+0

hmm No lo he pensado así de simple. sin embargo, mi solicitud se manejó con el método y también, como dije antes, podía devolver String. Y también es posible que solicite ajax antes de mencionarlo. Creo que un chico de primavera tendrá mi problema thx para su respuesta – dupdup

0

Esto es solo una suposición, pero por defecto Jackson solo detecta automáticamente los campos públicos (y los buscadores públicos, pero todos los establecedores independientemente de la visibilidad). Es posible configurar esto (con la versión 1.5) para que también detecte automáticamente los campos privados si así lo desea (consulte here para obtener más información).

+0

Thx Lo he intentado antes. – dupdup

0

Supongo que 404 no está relacionado con su HttpMessageConverter. Tuve el mismo problema 404 y la razón fue que olvidé que solo las solicitudes que coinciden con <url-pattern> se envían a DispatcherServlet (modifiqué la asignación de solicitud de * .do a * .json). Tal vez este es tu caso también.

3

Esto funcionó para mí:

@RequestMapping(value = "{p_LocationId}.json", method = RequestMethod.GET) 
protected void getLocationAsJson(@PathVariable("p_LocationId") Integer p_LocationId, 
    @RequestParam("cid") Integer p_CustomerId, HttpServletResponse response) { 
     MappingJacksonHttpMessageConverter jsonConverter = 
       new MappingJacksonHttpMessageConverter(); 
     Location requestedLocation = new Location(p_LocationId); 
     MediaType jsonMimeType = MediaType.APPLICATION_JSON; 
     if (jsonConverter.canWrite(requestedLocation.getClass(), jsonMimeType)) { 
     try { 
      jsonConverter.write(requestedLocation, jsonMimeType, 
            new ServletServerHttpResponse(response)); 
      } catch (IOException m_Ioe) { 
       // TODO: announce this exception somehow 
      } catch (HttpMessageNotWritableException p_Nwe) { 
       // TODO: announce this exception somehow 
      } 
     } 
} 

Tenga en cuenta que el método no devuelve nada: MappingJacksonHttpMessageConverter#write() hace la magia.

22

necesita lo siguiente:

  1. Conjunto modelo de programación de anotación impulsada: poner en <mvc:annotation-driven />spring.xml
  2. frasco Lugar jaskson (Maven artifactId es org.codehaus.jackson:jackson-mapper-asl) en la ruta de clase.
  3. uso de la siguiente manera:

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST }) 
    public @ResponseBody Foo method(@Valid Request request, BindingResult result){ 
    return new Foo(3,4) 
    } 
    

Esto funciona para mí.

Tenga en cuenta que

  1. @ResponseBody se aplica para volver tipo, no a la definición del método.
  2. Necesita la anotación @RequestMapping, para que Spring lo detecte.
+1

La parte clave aquí, creo, es que el OP no tiene un RequestMapping. Siempre que, como sugieres, sea importante. – GaryF

+0

@GaryF actualizó mi respuesta. – uthark

+0

@ResponseBody se aplica al tipo de devolución; este fue mi problema, ¡gracias! – ebelisle

1

encontré que necesito Jackson-core-asl.jar también, no sólo Jackson-mapper-asl.jar

3

La interfaz MessageConverter http://static.springsource.org/spring/docs/3.0.x/javadoc-api/ define un método(), getSupportedMediaTypes que en el caso de la MappingJacksonMessageCoverter devuelve la aplicación/json

public MappingJacksonHttpMessageConverter() { 
    super(new MediaType("application", "json", DEFAULT_CHARSET)); 
} 

Supongo que hay que aceptar: falta el encabezado de solicitud de aplicación/json.

0

Además de las respuestas aquí ..

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

Java:

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

Jquery (es necesario 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'); 
    } 
}); 
Cuestiones relacionadas