2015-01-16 18 views
7

Nach einer Menge Suche habe ich aufgespürt, wie java.util.Date Felder in Serialisierung in Zeitstempel bei der Konvertierung zu JSON Antworten in meinem @RestController gestoppt werden.Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPS Zeitstempel im Frühjahr nicht ausschalten

Allerdings kann ich es nicht zu arbeiten. Alle Posts, die ich gefunden habe, haben die Funktion SerializationFeature.WRITE_DATES_AS_TIMESTAMPS des Jackson Objet Mappers deaktiviert. Also schrieb ich den folgenden Code:

public class MVCConfig { 

    @Autowired 
    Jackson2ObjectMapperFactoryBean objectMapper; 

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

Wie ich es verstehe, ein config eine Bohne und so Auto Verdrahtung im Objekt-Mapper setzen zusätzliche Eigenschaften funktionieren sollen. Ich habe Breakpoints benutzt und alles sieht gut aus mit diesem Setup.

Allerdings, wenn ich eine Bohne mit einer java.util.Date Eigenschaft in einer Antwort auf eine http-Anfrage serialise, bin ich immer noch einen Zeitstempel zu bekommen.

Weiß jemand, warum dies nicht funktioniert? Es hat mich verblüfft!

+0

Ich habe etwas aus nur dachte. Ich erstelle eine Objekt-Mapper-Bean im Basiskontext, damit meine Back-End-Services diese verwenden können, um JSON von externen Servern zu deserialisieren. Diese Bean wird vom obigen MVC-Code abgeholt. Wenn ich jedoch eine Antwort auf eine Anfrage serialisiere, wird stattdessen ein Nachrichtenkonverter verwendet. Also muss ich herausfinden, wie ich diese Bean ansprechen soll und nicht, dass die Objekt-Mapper-Bean von meinem Backend verwendet wird. – drekka

Antwort

21

Nach vielen Herumspielen I festgestellt, dass der folgende Code das Problem behoben:

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

Ich bin nicht sicher, ob es eine einfachere Möglichkeit gibt, auf den Jackson MVC Nachrichtenkonverter zuzugreifen und ihn zu konfigurieren. Aber das funktioniert für mich.

+0

Funktioniert nicht für mich, obwohl der Code beim Start ausgeführt wird. Hast du auch irgendwelche xml configs benutzt? Vielleicht ist es nicht möglich, sie zu mischen? – Journeycorner

+0

Nein. Meine App ist eine 100% reine Java App. – drekka

+1

Sie müssen @EnableWebMvc hinzufügen, damit die Klasse funktioniert –

0

Ja, Haken in und um das Objekt Mapper ändern, die der Konverter Sie verwendet sollte

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

so etwas wie zu tun und in Ihrem MVCConfig

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

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

Hmm. Ich hatte gehofft, dass es eine Möglichkeit geben würde, die Serialisierungs-Bean in der Backend-Konfiguration zu erstellen, und die webMvc sie einfach verwenden oder automatisch zur Liste der Konverter hinzufügen würde. Ich werde es versuchen und sehen, was passiert. – drekka

+0

Konnte das nicht zum arbeiten bringen. Siehe meine Lösung unten. Danke trotzdem. – drekka