2015-08-11 3 views
1

В Spring boot 1.2.5 с интерфейсом Jersey 2, как я могу настроить маршаллера JSON, чтобы он не включал поля с нулевыми значениями?Spring Boot 1.2.5 & Jersey 2 игнорировать поля нуля

Например:

[ 
    { 
     "created": 1433987509174, 
     "lastModified": 1433876475580, 
     "id": 1, 
     "example": "example1b" 
    }, 
    { 
     "created": 1434502031212, 
     "lastModified": 1434502031212, 
     "id": 10000, 
     "example": "example1c" 
    }, 
    { 
     "created": 1439151444176, 
     "lastModified": 1439151444176, 
     "id": 10011, 
     "example": null 
    } 
] 

Поле "example": null не должны быть включены в выходной JSon вообще, но здесь это указать это нуль.

В моем классе @SpringBootApplication, я попытался добавить:

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
    final ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    converter.setObjectMapper(objectMapper); 
    return converter; 
} 

или

@Bean 
@Primary 
public Jackson2ObjectMapperBuilder objectMapperBuilder() { 
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
    builder.serializationInclusion(JsonInclude.Include.NON_NULL); 
    return builder; 
} 

или

@Primary 
@Bean 
public ObjectMapper mapper() { 
    final ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    return objectMapper; 
} 

и/или добавление @JsonSerialize (в том числе = включение. NON_NULL) к самому объекту

Но он по-прежнему производит тот же самый ответ выше с включенным "example": null.

Он работал с Spring 3.0.7 с @JsonSerialize(include=Inclusion.NON_NULL), но теперь он больше не работает, когда я портировал Spring Boot 1.2.5.

Я полагаю, что я следил за документацией http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper, и это не работает, поэтому я надеюсь, что кто-то может увидеть что-то, что мне не хватает? Заранее спасибо!

Edit: Также просто попытался добавить класс:

@Configuration 
public class WebConfiguration extends WebMvcAutoConfiguration { 
    @Primary 
    @Bean 
    public ObjectMapper mapper() { 
     final ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     return objectMapper; 
    } 
} 

Решение:

package com.my.spring; 

import javax.ws.rs.ext.ContextResolver; 

import org.glassfish.jersey.server.ResourceConfig; 
import org.glassfish.jersey.servlet.ServletProperties; 
import org.springframework.context.annotation.Configuration; 

import com.my.spring.service.rs.MyRestServiceImpl; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.databind.ObjectMapper; 

@Configuration 
public class JerseyConfiguration extends ResourceConfig { 

    public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> { 
     private final ObjectMapper mapper; 

     public ObjectMapperContextResolver() { 
      mapper = new ObjectMapper(); 
      mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     } 

     @Override 
     public ObjectMapper getContext(Class<?> type) { 
      return mapper; 
     } 
    } 

    public JerseyConfiguration() { 
     register(new ObjectMapperContextResolver()); 
     register(MyRestServiceImpl.class); // My jax-rs implementation class 
     property(ServletProperties.FILTER_FORWARD_ON_404, true); // Not needed for this non_null issue 
    } 
} 

ответ

2

Я не знаю, о смешении Spring путь (конфигурирования картографа) и как Джерси справляется с этим. Но способ Джерси настроить ObjectMapper составляет ContextResolver, как видно из this answer.

Затем зарегистрируйте ObjectMapperContextResolver с помощью your Jersey configuration.

public JerseyConfig extends ResourceConfig { 
    public JerseyConfig() { 
     ... 
     register(ObjectMapperContextResolver.class); 
    } 
} 

Или, если вы сканирование пакета, @Provider аннотация подберет класс.

+0

Спасибо! Имеет смысл, что вместо преобразователя весов используется каркас джерси, поскольку я выбрал интерфейс JAX-RS. Это решение работает. Почему-то этот вопрос не появился в моем поиске, или это могло бы немного смутить меня. – Chip