我希望获得一些调试此问题的帮助。 如果我将以下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
}
}
但是,如果我现在发送以下信息:
{
"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
}
}
我收到上述错误。在我的后端代码中,我有以下内容:
@DynamoDBTypeConverted(converter = ZonedDateTimeTypeConverter.class)
@DynamoDBAttribute(attributeName = "scheduledStartTime")
public ZonedDateTime scheduledStartTime;
API方法签名如下:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity create(@RequestBody Event event) {...}
我相信我遇到的问题是JSON无法解析为ZonedDateTime。是否有人建议(1)json字符串格式ZonedDateTime自动接受什么时间,或(2)如何使DTO解析分区的日期时间?
谢谢!
答案 0 :(得分:3)
假设您使用的是基于FasterXML Jackson的最“默认”配置。
如果是这样,则只需要在应用程序中为ZonedDateTime
配置正确的序列化器和反序列化器;可能是自定义关键字,也可能是jackson-datatype-jsr310 (推荐)中的关键字。
我创建了一个小/最小的示例,该示例基于 Spring 5.0.9 和 Jackson 2.9.6 (当前为最新版本)。
请在这里找到它:spring5-rest-zoneddatetime >>,主要部分是:
Event
DTO:
public class Event {
private long id;
private String name;
private ZonedDateTime time;
// Constructors, public getters and setters
}
字段time
可能是与您的示例相同的public
,这也很好,但是如果字段为private
-那么您将需要public
getter和setter
注意::这里我忽略了@DynamoDBTypeConverted
和@DynamoDBAttribute
注释,因为它们与持久性逻辑有关,而不与REST层有关。
EventController
仅包含与您相同的一种方法:
@RestController
public class EventController {
@RequestMapping(value = "/event", method = RequestMethod.POST)
public ResponseEntity post(@RequestBody Event event) {
System.out.println("Event posted: " + event.toString());
return ResponseEntity.ok(event);
}
}
pom.xml
中的依赖关系如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.6</version>
</dependency>
这里重要的是 JSR-310 数据类型实现,该实现还引入了com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer
和com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer
。
如果需要自定义序列化器/反序列化器,请检查this question >>
time
字段将支持下一日期格式:
"2018-01-01T22:25:15+01:00[Europe/Paris]"
-不完全是 ISO 8601 btw "2018-01-01T22:25:15+01:00"
"2018-01-01T22:25:15.000000001Z"
1514768461.000000001
-浮点数,距离1970-01-01, 00:00:00 [UTC]
的秒数默认情况下,REST APi响应将使用浮点数表示日期,例如在我们的案例中,响应将如下所示:
{
"id": 3,
"name": "Test event",
"time": 1514768460
}
要返回字符串值,请检查例如这个question >>
还需要提及的是,如果您改用 Spring Boot (入门),那么上面讨论的所有内容都将立即可用。
答案 1 :(得分:0)
以这种格式发送 2016-08-22T14:30 + 08:00 [Asia / Kuala_Lumpur]
LocalDateTime ldt = LocalDateTime.of(2016, Month.AUGUST, 22, 14, 30);
ZonedDateTime klDateTime = ldt.atZone(ZoneId.of("Asia/Kuala_Lumpur"));