que leer desarrollo blog arquitectura java json spring spring-mvc jackson

java - leer - Spring 3.0 realizando una respuesta JSON utilizando el convertidor de mensajes jackson



blog desarrollo java (8)

configuro mi messageconverter como Jackson entonces

class Foo{int x; int y}

y en el controlador

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

de eso estoy esperando devolver una cadena JSON {x: ''3'', y: ''4''} del servidor sin ninguna otra configuración. pero obteniendo la respuesta de error 404 a mi solicitud de ajax

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

Me equivoco ? 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 agregar anotaciones para la 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>


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


Descubrí que también necesito jackson-core-asl.jar, no solo jackson-mapper-asl.jar


Esto es sólo una suposición, pero por defecto Jackson solo detecta automáticamente los campos públicos (y los captadores 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 (vea here para más detalles).


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.


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

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

Supongo que falta un encabezado Accept: solicitud / json.


Necesitas lo siguiente:

  1. Establecer un modelo de programación basado en anotaciones: put <mvc:annotation-driven /> en spring.xml
  2. Coloque el jaskson jar (Maven artifactId es org.codehaus.jackson:jackson-mapper-asl ) en classpath.
  3. Use como el siguiente:

    @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 al tipo de devolución, no a la definición del método.
  2. Necesita la anotación @RequestMapping para que Spring lo detecte.

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


Un error HTTP 404 solo significa que no se puede encontrar el recurso. Eso puede tener 2 causas:

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

Para corregir 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.