我正在尝试使用Jackson将ISO8601格式的日期反序列化为Java8 Instant.我使用ObjectMapper注册了JavaTimeModule,关闭了WRITE_DATES_AS_TIMESTAMPS.
但是,如果尝试反序列化2016-03-28T19:00:00.000 + 01:00它将无法工作,因为似乎JavaTimeModule将仅反序列化使用UTC时区偏移量格式化的日期时间(例如2016-03-28T18:00 :00.000Z).然后我尝试使用@JsonFormat注释,如下所示:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "UTC")
Run Code Online (Sandbox Code Playgroud)
像这样:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = JsonFormat.DEFAULT_TIMEZONE)
Run Code Online (Sandbox Code Playgroud)
但是,这些都不起作用,我得到一个例外:
com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"])
Run Code Online (Sandbox Code Playgroud)
这意味着时区参数被忽略,日期时间格式化程序不知道如何在没有时区的情况下格式化Instant.
有没有办法在没有编写自定义反序列化器的情况下,使用Jackson和JavaTimeModule将不在UTC时区偏移的ISO8601字符串反序列化为Java 8 Instant?
我希望得到一些帮助调试此问题.如果我将以下JSON发送到我的后端,它可以正常工作:
{
"approvalRequired": false,
"location": {
"locationName": "<+37.33233141,-122.03121860> +\/- 5.00m (speed 0.00 mps \/ course -1.00) @ 9\/16\/18, 9:24:59 PM Pacific Daylight Time",
"longitude": -122.0312186,
"latitude": 37.332331410000002
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我现在发送以下内容:
{
"approvalRequired": false,
"scheduledStartTime": "2016-01-01T10:24:00+01:00",
"location": {
"locationName": "<+37.33233141,-122.03121860> +\/- 5.00m (speed 0.00 mps \/ course -1.00) @ 9\/16\/18, 9:24:59 PM Pacific Daylight Time",
"longitude": -122.0312186,
"latitude": 37.332331410000002
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了上述错误.在我的后端代码中,我有以下内容:
@DynamoDBTypeConverted(converter = ZonedDateTimeTypeConverter.class)
@DynamoDBAttribute(attributeName = "scheduledStartTime")
public ZonedDateTime scheduledStartTime;
Run Code Online (Sandbox Code Playgroud)
API方法签名如下所示:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity create(@RequestBody Event event) {...} …Run Code Online (Sandbox Code Playgroud)