web-dev-qa-db-fra.com

Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPS ne pas désactiver l'horodatage au printemps

Après de nombreuses recherches, j'ai trouvé comment arrêter la sérialisation des champs Java.util.Date en horodatages lors de la conversion en réponses JSON dans mon @RestController.

Cependant, je ne peux pas le faire fonctionner. Tous les articles que j'ai trouvés disaient de désactiver la fonctionnalité SerializationFeature.WRITE_DATES_AS_TIMESTAMPS du mappeur d'objet de Jackson. J'ai donc écrit le code suivant:

public class MVCConfig {

    @Autowired
    Jackson2ObjectMapperFactoryBean objectMapper;

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

Si je comprends bien, une configuration est un bean. Le câblage automatique dans le mappeur d’objets pour définir des propriétés supplémentaires devrait donc fonctionner. J'ai utilisé des points d'arrêt et tout semble bien avec cette configuration.

Cependant, lorsque je sérialise un bean avec une propriété Java.util.Date dans une réponse à une requête http, je reçois toujours un horodatage. 

Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas? Ça m'a stumped!

9
drekka

Après beaucoup de déconner, j'ai trouvé que le code suivant corrigeait le problème:

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

Je ne sais pas s'il existe un moyen plus facile d'accéder au convertisseur de messages Jackson MVC et de le configurer. Mais cela fonctionne pour moi.

27
drekka

Oui, pour vous connecter et changer le mappeur d'objets utilisé par le convertisseur, vous devez faire quelque chose comme:

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

et dans votre MVCConfig  

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

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