我正在尝试在 Web 应用程序中配置 ObjectMapper,以序列化/反序列化以 ISO 8601 格式显示为 Joda DateTime 的日期。我发现有用的库jackson-datatype-joda
它的模块JodaModule
所以我添加了依赖项:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.4.4</version>
</dependency>
我的Spring配置:
<bean id="objectMapper"
class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
p:indentOutput="true">
<property name="featuresToDisable">
<array>
<util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS" />
</array>
</property>
<property name="modulesToInstall" value="com.fasterxml.jackson.datatype.joda.JodaModule" />
</bean>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
当我尝试序列化这个bean时
public class Bean {
private DateTime start = new DateTime();
public DateTime getStart() { return start; }
public void setStart(DateTime start) { this.start = start; }
}
我得到以下输出,但希望它采用 ISO 8601 格式:
{"start":1418337158933}
我找到JodaModule
如果在类路径中找到它,也会预加载,因此无需手动注册它(请参阅github 仓库 https://github.com/spring-projects/spring-framework/blob/2fccf3ff4409a641c20947e8fca90308f7236c64/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java#L568)但此代码在应用程序启动期间被多次调用。
我认为原因是ObjectMapper
在其他地方实例化。
UPDATE:问题是还有一个带有 Spring 配置的文件,其中声明了 ObjectMapper。答案中给出的两种解决方案都有效。干杯!