Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPS在春天没有关闭时间戳

时间:2015-01-16 06:56:37

标签: json spring serialization jackson

经过大量搜索后,我在我的@RestController中转换为JSON响应时,跟踪了如何阻止java.util.Date字段被序列化为时间戳。

但是我无法让它发挥作用。我发现的所有帖子都说要禁用Jackson objet映射器的SerializationFeature.WRITE_DATES_AS_TIMESTAMPS功能。所以我写了下面的代码:

public class MVCConfig {

    @Autowired
    Jackson2ObjectMapperFactoryBean objectMapper;

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

据我了解,配置也是一个bean,因此在对象映射器中自动连接以设置其他属性应该有效。我使用了断点,这个设置一切都很好。

然而,当我在对http查询的响应中使用java.util.Date属性序列化bean时,我仍然得到一个时间戳。

有谁知道为什么这不起作用?这让我很难过!

4 个答案:

答案 0 :(得分:28)

经过大量的讨论后,我发现以下代码解决了这个问题:

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

我不确定是否有更简单的方法来访问Jackson MVC消息转换器并对其进行配置。但这对我有用。

答案 1 :(得分:1)

是的,我同意@Feyyaz:将config添加到properties / yml文件是一种配置默认上下文(反)序列化器的方法,当它不受您的控制并且只能由Spring上下文操纵时。 / p>

有关更多详细信息,请参见Spring文档的这一部分:

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper

在原始链接删除的情况下引用:

  

79.3自定义Jackson的ObjectMapper

     

Spring MVC(客户端和服务器端)使用HttpMessageConverters来协商HTTP交换中的内容转换。如果Jackson在类路径中,则您已经获得Jackson2ObjectMapperBuilder提供的默认转换器,该转换器的实例已为您自动配置。   ObjectMapper(对于Jackson转换器为XmlMapper)(默认创建)实例具有以下自定义属性:

     
      
  • MapperFeature.DEFAULT_VIEW_INCLUSION已禁用
  •   
  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES已禁用
  •   
  • SerializationFeature.WRITE_DATES_AS_TIMESTAMPS已禁用
  •   
     

Spring Boot还具有一些功能,可以更轻松地自定义此行为。   您可以使用环境来配置ObjectMapperXmlMapper实例。杰克逊提供了一套广泛的简单的开/关功能,可用于配置其处理的各个方面。这些功能在六个枚举中进行了描述:

     

|枚举物业|价值观|   | -| -| -|   | com.fasterxml.jackson.databind.DeserializationFeature | spring.jackson.deserialization.<feature_name> | truefalse |   | com.fasterxml.jackson.core.JsonGenerator.Feature | spring.jackson.generator.<feature_name> | truefalse |   | com.fasterxml.jackson.databind.MapperFeature | spring.jackson.mapper.<feature_name> | truefalse |   | com.fasterxml.jackson.core.JsonParser.Feature | spring.jackson.parser.<feature_name> | truefalse |   | com.fasterxml.jackson.databind.SerializationFeature | spring.jackson.serialization.<feature_name> | truefalse |   | com.fasterxml.jackson.annotation.JsonInclude.Include | spring.jackson.default-property-inclusion | alwaysnon_nullnon_absentnon_defaultnon_empty |

     

例如,要启用漂亮打印,请设置spring.jackson.serialization.indent_output=true。请注意,由于使用了relaxed bindingindent_output的情况不必与相应的枚举常量INDENT_OUTPUT的情况相匹配。   这种基于环境的配置适用于自动配置的Jackson2ObjectMapperBuilder bean,并且适用于使用构建器创建的任何映射器,包括自动配置的ObjectMapper bean。   上下文的Jackson2ObjectMapperBuilder可以由一个或多个Jackson2ObjectMapperBuilderCustomizer bean自定义。可以对此类定制器bean进行排序(Boot自己的定制器的顺序为0),从而可以在Boot定制之前和之后应用其他定制。   类型为com.fasterxml.jackson.databind.Module的所有bean都会自动向自动配置的Jackson2ObjectMapperBuilder注册,并应用于它创建的任何ObjectMapper实例。当您向应用程序中添加新功能时,这提供了一种用于贡献自定义模块的全局机制。   如果要完全替换默认的ObjectMapper,请定义该类型的@Bean并将其标记为@Primary,或者,如果您更喜欢基于构建器的方法,请定义{{1 }} Jackson2ObjectMapperBuilder。请注意,无论哪种情况,这样做都会禁用@Bean的所有自动配置。   如果提供类型为ObjectMapper的任何@Beans,它们将替换MVC配置中的默认值。此外,还提供了类型为MappingJackson2HttpMessageConverter的便捷bean(如果使用默认的MVC配置,它将始终可用)。它提供了一些有用的方法来访问默认的和用户增强的消息转换器。   有关更多详细信息,请参见“ Section 79.4, “Customize the @ResponseBody Rendering””部分和WebMvcAutoConfiguration源代码。

(StackOverFlow降价不支持表语法,因此格式错误。将此部分复制并粘贴到Sublime Text中,另存为HttpMessageConverters,以查看或检查原始链接。)

示例:

.md

或者:

spring:
  jackson:
    default-property-inclusion: non_null # to exclude null in json serialization
    serialization:
      write-dates-as-timestamps: true # write milliseconds since epoch in the final json

答案 2 :(得分:0)

是的,要挂钩并更改转换器正在使用的对象映射器,您应该执行类似

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

并在 MVCConfig

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

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

答案 3 :(得分:0)

class MyClass extends