Spring 4.1.3中注册ObjectMapper来序列化Joda DateTime

2024-02-22

我正在尝试在 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。答案中给出的两种解决方案都有效。干杯!


如果您像下面的代码一样创建自定义 ObjectMapper 类,它将覆盖默认的 objectMapper 并且您根本不需要 xml 配置:

@Service
public class CustomObjectMapper extends ObjectMapper {
    public CustomObjectMapper() {
        this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        this.registerModule(new JodaModule());
    }
}

我已将这个简单的服务添加到简单的 Spring Boot 应用程序中,并以预期的格式获得了时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 4.1.3中注册ObjectMapper来序列化Joda DateTime 的相关文章

随机推荐