2015-01-16 9 views
7

Po wielu poszukiwaniach znalazłem sposób na zatrzymanie java.util.Date pól z serializacji na znaczniki czasu podczas konwertowania na odpowiedzi JSON w moim @RestController.Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPS nie wyłączając sygnatur czasowych na wiosnę

Jednak nie mogę go uruchomić. Wszystkie znalezione posty powiedziały, aby wyłączyć funkcję SerializationFeature.WRITE_DATES_AS_TIMESTAMPS programu Jackson objet mapper. Więc napisałem następujący kod:

public class MVCConfig { 

    @Autowired 
    Jackson2ObjectMapperFactoryBean objectMapper; 

    @PostConstruct 
    public void postConstruct() { 
     this.objectMapper.setFeaturesToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
    } 
} 

Jak rozumiem, config jest fasola a więc auto okablowania w odwzorowującego obiektu, aby ustawić dodatkowe właściwości powinno działać. Użyłem break points i wszystko wygląda dobrze z tą konfiguracją.

Jednak, gdy serializuję komponent bean z właściwością java.util.Date w odpowiedzi na zapytanie http, nadal otrzymuję sygnaturę czasową.

Czy ktoś wie, dlaczego to nie działa? To mnie zaskoczyło!

+0

Właśnie coś wymyśliłem. Tworzę obiektowy moduł odwzorowujący obiekty w kontekście podstawowym, aby moje usługi zaplecza mogły go użyć do deserializacji JSON pochodzącej z serwerów zewnętrznych. Ta fasola jest pobierana przez powyższy kod MVC. Jednak gdy serializuje się odpowiedź na żądanie, zamiast tego używany jest konwerter wiadomości. Więc muszę wymyślić, jak zaadresować tę fasolę, a nie za pomocą fasoli odwzorowującej obiekty, której używa mój back-end. – drekka

Odpowiedz

21

Po wielu aprowizacji I stwierdzono, że poniższy kod rozwiązał problem:

public class MVCConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { 
     for (HttpMessageConverter<?> converter : converters) { 
      if (converter instanceof MappingJackson2HttpMessageConverter) { 
       MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter; 
       ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper(); 
       objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
       break; 
      } 
     } 
    } 
} 

Nie jestem pewien, czy istnieje łatwiejszy sposób na uzyskanie dostępu do konwertera wiadomości Jackson MVC i skonfigurowanie go. Ale to działa dla mnie.

+0

Nie działa dla mnie, chociaż kod jest wykonywany przy starcie. Czy używałeś również dowolnych konfiguracji xml? Może nie można ich mieszać? – Journeycorner

+0

Nie. Moja aplikacja jest w 100% czystą aplikacją java. – drekka

+1

Konieczność dodania @EnableWebMvc do klasy do pracy –

0

Tak, aby podłączyć się i zmienić mapowania obiektów, że przetwornica jest przy użyciu należy zrobić coś jak

public class CustomObjectMapper extends ObjectMapper { 
    public CustomObjectMapper() { 
     this.configure(com.fasterxml.jackson.databind.SerializationFeature. 
       WRITE_DATES_AS_TIMESTAMPS, false); 
    } 
} 

i wewnątrz MVCConfig

@Bean 
public ObjectMapper jacksonObjectMapper() { 
    return new CustomObjectMapper(); 
} 

@Bean 
public SerializationConfig serializationConfig() { 
    return jacksonObjectMapper().getSerializationConfig(); 
} 
+0

Hmm. Miałem nadzieję, że istnieje sposób na stworzenie fasoli serializacyjnej w konfiguracji zaplecza i czy webMvc po prostu go użyje lub automatycznie doda do listy konwerterów. Spróbuję i zobaczę, co się stanie. – drekka

+0

Nie można tego zmusić do działania. Zobacz moje rozwiązanie poniżej. Dzięki i tak. – drekka

Powiązane problemy