如何阻止杰克逊在SpringMVC中将日期写为时间戳

时间:2017-09-18 12:05:53

标签: java spring rest

我一直在阅读关于Spring启动的教程,在那里我学会了如何阻止jackson将日期转换为时间戳。例如:

{"birthDate":1505736233603} //before
{"birthDate":"2017-09-18T12:04:27.345+0000"}//after

写作

 spring.jackson.serialization.write-dates-as-timestamps=false
application.properties。

我如何为SpringMVC做同样的事情,当然 SpringMVC

中没有 application.properties

3 个答案:

答案 0 :(得分:4)

您必须配置Spring Bean,负责创建服务返回的JSON。

首先,您需要定义转换器将用于创建JSON的Jackson Object Mapper Bean:

<bean class="com.fasterxml.jackson.databind.ObjectMapper" id="objectMapper">
    <property name="dateFormat">
        <bean class="java.text.SimpleDateFormat">
            <constructor-arg value="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"/>
        </bean>
    </property>
</bean>

(请注意,您可以定义所需的dateFormat)。

然后,您需要将此objectMapper bean注入JSON消息转换器:

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="false">
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper"/>
        </bean>

    </mvc:message-converters>
</mvc:annotation-driven>    

如您所见,我正在使用“mvc”命名空间(“http://www.springframework.org/schema/mvc”)来定义MVC bean。

如果您使用的是Annotations而不是XML配置,那么您可以通过定义下一个Configuration类(或使其适应您的代码:)来完成相同的操作:))

@EnableWebMvc
@Configuration
@ComponentScan({ "com.yourorg.app" })
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(
        List<HttpMessageConverter<?>> converters) {
        messageConverters.add(new createJsonHttpMessageConverter()); 
        super.configureMessageConverters(converters);
    }

    private HttpMessageConverter<Object> createJsonHttpMessageConverter() {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));

        MappingJackson2HttpMessageConverter jsonConverter = 
           new MappingJackson2HttpMessageConverter();
        jsonConverter.setObjectMapper(objectMapper);

        return jsonConverter;
    }
}

希望这会有所帮助:)

答案 1 :(得分:0)

如果您有权访问ObjectMapper,您也可以通过编程方式将其设置为属性

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.setDateFormat(new ISO8601DateFormat());

答案 2 :(得分:0)

另一种方法是在由框架填充/配置 MessageConverter 后对其进行配置:

@EnableWebMvc
@Configuration
public class AppConfiguration implements WebMvcConfigurer {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof AbstractJackson2HttpMessageConverter) {
                AbstractJackson2HttpMessageConverter jacksonconverter = (AbstractJackson2HttpMessageConverter) converter;
                jacksonconverter.getObjectMapper()
                        .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
            }
        }
    }
}

此外,此代码也应适用于 SMILE,因为 MappingJackson2SmileHttpMessageConverter 扩展了 AbstractJackson2HttpMessageConverter