簡體   English   中英

客戶端發送的請求在語法上不正確 Java ZonedDateTime 后端

[英]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.9Jackson 2.9.6 (當前最新版本)的小/最小示例。

請在這里找到它: spring5-rest-zoneddatetime >> ,主要部分是:

  1. 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 層。

  2. 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); } }
  3. 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.ZonedDateTimeSerializercom.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer


附加信息:

  1. 如果需要自定義序列化器/反序列化器,請檢查此問題>>

  2. 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]
  3. 默認情況下,REST API 響應將使用浮點數作為日期,例如,在我們的示例中,響應將如下所示:

     { "id": 3, "name": "Test event", "time": 1514768460 }

    要返回字符串值,請檢查例如這個問題>>

  4. 還需要提到的是,如果您將使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM