我在像这样的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”(一小时差异)。
是否可以禁用这些调整,以便反序列化原始日期?
答案 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
,不会修改时间。确认杰克逊的时区未被修改。例如。如果mapper
是ObjectMapper
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;