gpt4 book ai didi

java - 客户端发送的请求在语法上不正确 Java ZonedDateTime 后端

转载 作者:IT王子 更新时间:2023-10-29 05:44:16 25 4
gpt4 key购买 nike

我希望得到一些帮助来调试这个问题。如果我将以下 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) ZonedDateTime 自动接受 json 字符串格式的时间或 (2) 如何制作 DTO 来解析分区日期时间提出建议?

谢谢!

最佳答案

解决方案:

假设您使用的是最“默认”的配置,它基于 FasterXML Jackson .

如果是这样,那么您只需要在您的应用程序中为 ZonedDateTime 配置正确的序列化器和反序列化器;它可能是自定义的或来自 jackson-datatype-jsr310(推荐)


我创建了一个小/最小示例,它基于 Spring 5.0.9Jackson 2.9.6(当前最新版本)。

请在这里找到:spring5-rest-zoneddatetime >> ,主要部分有:

  1. 事件 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 层。

  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. 如果需要自定义序列化器/反序列化器,请检查this question >>

  2. 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 - float ,从 1970-01-01,00:00:00 [UTC]
    • 算起的秒数
  3. 默认情况下,REST API 响应将使用 float 作为日期,例如在我们的例子中,响应看起来是这样的:

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

    要改为返回字符串值,请检查例如这个question >>

  4. 还需要提及的是,如果您将改用 Spring Boot(良好的开端)- 上面讨论的所有内容都可以开箱即用。

关于java - 客户端发送的请求在语法上不正确 Java ZonedDateTime 后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52361138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com