在弹簧集成应用程序中禁用jackson的时区调整

时间:2018-02-22 15:43:53

标签: java jackson timezone spring-integration

我在像这样的Spring集成应用程序中反序列化JSON:

<int:json-to-object-transformer type="com.something.domain.Transaction[]" />

除了处理日期之外,这通常运作良好。

带注释的类包含以下内容:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
@JsonProperty("clickDate")
private Date clickDate;

日期被解析没有错误,但测试显示杰克逊确实进行了时区调整。例如。如果JSON包含日期“2018-02-15T11:43:00”,则反序列化器将其转换为等效的“2018-02-15T12:43:00”(一小时差异)。

是否可以禁用这些调整,以便反序列化原始日期?

2 个答案:

答案 0 :(得分:0)

到目前为止,您不确定禁用的含义,但如果可行,您可以通过以下方式执行此操作:

<xsd:attribute name="object-mapper" use="optional">
        <xsd:annotation>
            <xsd:documentation>
                Optional reference to a JsonObjectMapper instance.
                By default, a JsonObjectMapper that uses a Jackson 2 ObjectMapper.
            </xsd:documentation>
            <xsd:appinfo>
                <tool:annotation kind="ref">
                    <tool:expected-type type="org.springframework.integration.support.json.JsonObjectMapper" />
                </tool:annotation>
            </xsd:appinfo>
        </xsd:annotation>
    </xsd:attribute>

并使用:

public Jackson2JsonObjectMapper(ObjectMapper objectMapper) {

来自杰克逊的自定义ObjectMapper

默认情况下,Spring Integration使用以下内容:

public Jackson2JsonObjectMapper() {
    this.objectMapper = new ObjectMapper();
    this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
    this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    registerWellKnownModulesIfAvailable();
}

其中registerWellKnownModulesIfAvailable()代表这些模块:

com.fasterxml.jackson.datatype.jdk7.Jdk7Module
com.fasterxml.jackson.datatype.jdk8.Jdk8Module
com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
com.fasterxml.jackson.datatype.joda.JodaModule
com.fasterxml.jackson.module.kotlin.KotlinModule

因此,即使其中一个基于时间的模块也可以帮助您而无需任何修改。

答案 1 :(得分:0)

杰克逊默认使用UTC时区解析Date,不会修改时间。确认杰克逊的时区未被修改。例如。如果mapperObjectMapper

System.out.println(mapper.getDeserializationConfig().getTimeZone());

然后,您可以使用setTimeZone

设置时区

如果证明无法修改Jackson的timezome设置,您可以通过在@JsonFormat注释中指定时区来覆盖字段:

@JsonFormat(shape = JsonFormat.Shape.STRING,
            pattern = "yyyy-MM-dd'T'HH:mm:ss",
            timezone = "UTC")
Date clickDate;