2015-01-16 10 views
7

Dopo molte ricerche ho rintracciato come fermare i campi java.util.Date dalla serializzazione in timestamp quando si convertono in risposte JSON nel mio @RestController.Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPS non disattivando i timestamp in primavera

Tuttavia non riesco a farlo funzionare. Tutti i post che ho trovato hanno disabilitato la funzionalità SerializationFeature.WRITE_DATES_AS_TIMESTAMPS del Jackson Objet Mapper. Così ho scritto il seguente codice:

public class MVCConfig { 

    @Autowired 
    Jackson2ObjectMapperFactoryBean objectMapper; 

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

quanto ho capito, un config è un fagiolo pure in modo automatico il cablaggio nel mapper oggetto per impostare proprietà aggiuntive dovrebbero funzionare. Ho usato punti di rottura e tutto sembra a posto con questa configurazione.

Tuttavia, quando serializzo un bean con una proprietà java.util.Date in una risposta a una query http, sto ancora ottenendo un timestamp.

Qualcuno sa perché questo non funziona? Mi ha lasciato perplesso!

+0

Ho appena capito qualcosa. Sto creando un bean mapper di oggetti nel contesto di base in modo che i miei servizi back-end possano utilizzarlo per deserializzare JSON proveniente da server esterni. Questo bean viene prelevato dal codice MVC sopra. Tuttavia, quando serializzo una risposta a una richiesta, viene utilizzato un convertitore di messaggi. Quindi dovrò capire come indirizzare quel bean piuttosto che il bean object mapper usato dal mio back-end. – drekka

risposta

21

Dopo un sacco di guai I ha rilevato che il seguente codice risolto il problema:

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; 
      } 
     } 
    } 
} 

Non sono sicuro se esiste un modo più semplice per accedere al convertitore di messaggi MVC di Jackson e configurarlo. Ma questo funziona per me.

+0

Non funziona per me, sebbene il codice sia eseguito all'avvio. Hai usato anche qualche configurazione xml? Forse non è possibile mescolarli? – Journeycorner

+0

No. La mia app è un'app java al 100%. – drekka

+1

È necessario aggiungere @EnableWebMvc sulla classe per funzionare –

0

Sì, per agganciare e cambiare il mapper oggetto che il convertitore sta usando si dovrebbe fare qualcosa di simile

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

e all'interno della vostra MVCConfig

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

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

Hmm. Speravo che ci sarebbe stato un modo per creare il bean di serializzazione nella configurazione di back-end e avere il webMvc semplicemente usarlo o aggiungerlo automaticamente alla lista dei convertitori. Darò questo a provare e vedere cosa succede. – drekka

+0

Non riuscivo a farlo funzionare. Vedi la mia soluzione qui sotto. Grazie comunque. – drekka

Problemi correlati