经过大量搜索后,我在我的@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时,我仍然得到一个时间戳。
有谁知道为什么这不起作用?这让我很难过!
答案 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文档的这一部分:
在原始链接删除的情况下引用:
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还具有一些功能,可以更轻松地自定义此行为。 您可以使用环境来配置
ObjectMapper
和XmlMapper
实例。杰克逊提供了一套广泛的简单的开/关功能,可用于配置其处理的各个方面。这些功能在六个枚举中进行了描述:|枚举物业|价值观| | -| -| -| |
com.fasterxml.jackson.databind.DeserializationFeature
|spring.jackson.deserialization.<feature_name>
|true
,false
| |com.fasterxml.jackson.core.JsonGenerator.Feature
|spring.jackson.generator.<feature_name>
|true
,false
| |com.fasterxml.jackson.databind.MapperFeature
|spring.jackson.mapper.<feature_name>
|true
,false
| |com.fasterxml.jackson.core.JsonParser.Feature
|spring.jackson.parser.<feature_name>
|true
,false
| |com.fasterxml.jackson.databind.SerializationFeature
|spring.jackson.serialization.<feature_name>
|true
,false
| |com.fasterxml.jackson.annotation.JsonInclude.Include
|spring.jackson.default-property-inclusion
|always
,non_null
,non_absent
,non_default
,non_empty
|例如,要启用漂亮打印,请设置
spring.jackson.serialization.indent_output=true
。请注意,由于使用了relaxed binding,indent_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