Spring configure @ResponseBody formato JSON

Imagina que tengo este método anotado en un Spring 3 @Controller

@RequestMapping("") public @ResponseBody MyObject index(@RequestBody OtherObject obj) { MyObject result = ...; return result; } 

Pero necesito configurar el formato json de salida, como si lo estuviera haciendo:

 ObjectMapper om = new ObjectMapper(); om.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, true); om.getSerializationConfig() .setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT); om.getSerializationConfig() .set(SerializationConfig.Feature.INDENT_OUTPUT, false); 

¿Hay alguna forma de configurar este comportamiento?

He encontrado un par de preguntas relacionadas, pero no estoy seguro de cómo adaptarlas a mi caso específico:

  1. prefixjson de spring con responsebody
  2. Quién establece el tipo de contenido de respuesta en Spring MVC (@ResponseBody)

Gracias !

Para las personas que usan la configuración Spring basada en Java :

 @Configuration @ComponentScan(basePackages = "com.domain.sample") @EnableWebMvc public class SpringConfig extends WebMvcConfigurerAdapter { .... @Override public void configureMessageConverters(List> converters) { final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); final ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); converter.setObjectMapper(objectMapper); converters.add(converter); super.configureMessageConverters(converters); } .... } 

Estoy usando MappingJackson2HttpMessageConverter , que es de fasterxml.

  com.fasterxml.jackson.core jackson-databind 2.3.1  

Si quieres usar el mapeador codehaus-jackson, utiliza este MappingJacksonHttpMessageConverter

   org.codehaus.jackson jackson-mapper-asl ${codehaus.jackson.version}  

Necesité resolver un problema muy similar, que configura a Jackson Mapper para “¡No serializar valores nulos por el amor de Cristo!”.

No quería dejar el elegante mvc: etiqueta impulsada por anotaciones, así que descubrí cómo configurar el ObjectMapper de Jackson sin eliminar mvc: impulsado por anotaciones y agregando no realmente lujoso ContentNegotiatingViewResolver.

¡Lo hermoso es que no tienes que escribir ningún código Java tú mismo!

Y aquí está la configuración XML (no se confunda con diferentes espacios de nombres de las clases de Jackson, simplemente utilicé la nueva biblioteca Jakson 2.x … lo mismo debería funcionar también con las bibliotecas de Jackson 1.x):

       NON_NULL       

AngerClown me indicó la dirección correcta.

Esto es lo que finalmente hice, solo en caso de que alguien lo encuentre útil.

                  NON_DEFAULT    

Todavía tengo que encontrar la forma de configurar las otras propiedades tales como:

 om.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, true); 

En spring3.2, la nueva solución es presentada por: http://static.springsource.org/spring/docs/3.2.0.BUILD-SNAPSHOT/api/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.html , el a continuación está mi ejemplo:

   ​​ ​​​ ​​​​ ​​​​​ ​​​​​​ ​​​​​​​ ​​​​​​ ​​​​​ ​​​​ ​​​ ​​  

Para Spring versión 4.1.3+

Intenté con la solución de Jama, pero luego todas las respuestas fueron devueltas con Content-type ‘application / json’, incluida la principal página HTML generada.

Reemplazar configureMessageConverters(...) evita que el muelle configure los conversores predeterminados. Spring 4.1.3 permite la modificación de conversores ya configurados anulando extendMessageConverters(...) :

 @Configuration public class ConverterConfig extends WebMvcConfigurerAdapter { @Override public void extendMessageConverters(List> converters) { for (HttpMessageConverter converter : converters) { if (converter instanceof AbstractJackson2HttpMessageConverter) { AbstractJackson2HttpMessageConverter c = (AbstractJackson2HttpMessageConverter) converter; ObjectMapper objectMapper = c.getObjectMapper(); objectMapper.setSerializationInclusion(Include.NON_NULL); } } super.extendMessageConverters(converters); } } 

ver org.springframework..WebMvcConfigurationSupport#getMessageConverters()

ver org.springframework..WebMvcConfigurationSupport#addDefaultHttpMessageConverters(...)

Escribí mi propia FactoryBean que crea una instancia de ObjectMapper (versión simplificada):

  public class ObjectMapperFactoryBean implements FactoryBean{ @Override public ObjectMapper getObject() throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); return mapper; } @Override public Class getObjectType() { return ObjectMapper.class; } @Override public boolean isSingleton() { return true; } } 

Y el uso en la configuración de spring:

          

No responde la pregunta, pero este es el resultado superior de google.

Si alguien viene aquí y quiere hacerlo para la spring 4 (como me sucedió a mí), puedes usar la anotación

 @JsonInclude(Include.NON_NULL) 

en la clase que regresa

Eche un vistazo al enfoque de Rick Hightower. Su enfoque evita configurar ObjectMapper como singleton y le permite filtrar la respuesta JSON para el mismo objeto de diferentes maneras para cada método de solicitud.

http://www.jroller.com/RickHigh/entry/filtering_json_feeds_from_spring

Puede configurar ObjectMapper como un bean en su archivo Spring xml. Lo que contiene una referencia a ObjectMapper es la clase MappingJacksonJsonView . Luego debe adjuntar la vista a ViewResolver.

Algo como esto debería funcionar:

                         

Donde customObjectMapper está definido en otra parte del archivo xml. Tenga en cuenta que puede establecer directamente los valores de propiedad de Spring con los Enums que Jackson define; mira esta pregunta

Además, ContentNegotiatingViewResolver probablemente no sea necesario, es solo el código que estoy usando en un proyecto existente.

Sí, pero qué sucede si comienza a usar mixins, por ejemplo, no puede tener ObjectMapper como singleton porque aplicará la configuración globalmente. ¿Entonces agregará o establecerá las clases mixin en la misma instancia de ObjectMapper?

Puedes hacer lo siguiente (versión de jackson <2):

Clase de mapeador personalizado:

 import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; import org.codehaus.jackson.map.annotate.JsonSerialize; public class CustomObjectMapper extends ObjectMapper { public CustomObjectMapper() { super.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, true); super.getSerializationConfig() .setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT); super.getSerializationConfig() .set(SerializationConfig.Feature.INDENT_OUTPUT, false); } } 

Configuración de spring: