[英]The request sent by the client was syntactically incorrect Java ZonedDateTime backend
我希望得到一些幫助來調試這個問題。 如果我將以下 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 解析分區日期時間?
謝謝!
假設您使用的是最“默認”的配置,它基於FasterXML Jackson 。
如果是這樣,那么您只需要在應用程序中為ZonedDateTime
正確配置序列化器和反序列化器; 它可能是自定義的或來自jackson-datatype-jsr310 (recommended) 的。
我創建了一個基於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
time
,這也很好,但如果字段是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
。
如果需要自定義序列化器/反序列化器,請檢查此問題>>
time
字段將支持下一個日期格式:
"2018-01-01T22:25:15+01:00[Europe/Paris]"
——順便說一句,不完全是ISO 8601"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 }
要返回字符串值,請檢查例如這個問題>>
還需要提到的是,如果您將使用Spring Boot (好的入門) - 上面討論的所有內容都將開箱即用。
以這種格式發送 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"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.