当前位置: 首页 > 知识库问答 >
问题:

客户端发送的请求在语法上不正确

黄彬
2023-03-14

我希望在调试这个问题时得到一些帮助。如果我将以下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。有人对以下两个问题有什么建议吗?( json字符串格式ZonedDateTime自动接受什么时间,( 2)如何创建DTO来解析zoned date time?

谢谢

共有2个答案

南门正祥
2023-03-14

按此格式发送2016-08-22T14:30 08:00[亚洲/吉隆坡]

LocalDateTime ldt = LocalDateTime.of(2016, Month.AUGUST, 22, 14, 30);

ZonedDateTime klDateTime = ldt.atZone(ZoneId.of("Asia/Kuala_Lumpur"));
丁灿
2023-03-14

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

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

我已经创建了一个小的/最小的例子,它基于Spring 5.0.9和Jackson 2.9.6(目前最新的版本)。

请在这里找到:spring5Rest区DateTime

>

  • 事件DTO:

    public class Event {
    
        private long id;
        private String name;
        private ZonedDateTime time;
    
        // Constructors, public getters and setters
    
    }
    

    字段time可能是public与您的示例相同,也可以,但如果字段是私有-那么您将需要publicgetter和setter。

    注意:我在这里忽略了< code > @ DynamoDBTypeConverted 和< code>@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);
        }
    
    }
    

    < code>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

    >

  • 如果需要自定义序列化器/期望化器,请检查此问题

    < code >时间字段将支持下次日期格式:

    • “2018-01-01T22:25:15 01:00[欧洲/巴黎]” - 不完全是ISO 8601 btw
    • “2018-01-01T22:25:15 01:00”
    • “2018-01-01T22:25:15.0000000001Z”
    • 1514768461.000000001 - 浮点数,从 1970-01-01 开始的秒数,00:00:00 [UTC]

    默认情况下,REST APi响应将使用浮点数表示日期,例如,在我们的例子中,响应看起来是这样的:

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

    要返回字符串值,请检查例如此问题

    还需要提到的是,如果您将使用Spring Boot(一个好的入门工具),上面讨论的所有事情都将开箱即用。

  •  类似资料:
    • 问题内容: 我在同一个主题上看过几个qts。但是我没有发现此错误的任何线索。 我正在研究POC,并点击下面的链接。 http://spring.io/guides/gs/uploading- files/ 如以上教程中所述,在独立模式下(春季嵌入式Tomcat),它可以正常工作。但是我想将其部署为Web应用程序。因此,我创建了一个单独的SpringMVC项目并添加了以下控制器。 控制器文件 我已经

    • 问题内容: 嗨,我在重定向期间收到了下一个错误: 客户端发送的请求在语法上不正确 浏览器显示的URL是:在这里,我的类首先重定向-“从”重定向,然后“重定向到”: 第二类: 解决 :我解决了这个问题,第二类的方法中有多余的参数。 问题答案: 在这种情况下,将登录级别设置为in 例如,当缺少参数或无法将其转换为所需的类型时,日志中将出现异常详细信息。

    • 这是我的控制器 我的豆子是 当我给出的名称介于5到45个字符之间时,表单将被验证。但当表单未被验证时,我会收到400状态错误报告。我不知道为什么我会出错。这里需要帮助吗

    • 我在这个问题上花了很多时间,但无法解决它。请帮忙!当我从JSP提交表单时,我得到了这个错误。我的代码: 和我的控制器代码: }

    • 我有一个表单,用户可以使用它将文件上传到本地驱动器,还可以将一些数据保存到数据库中。但是出现了这个错误消息,我想知道如何处理它。 控制器 形式本身 我试图先保存表单,我将使用单独的方法发送它。

    • 这里是LocationSearchMetaData.java 我的控制器 我的客户要求是这样的 下面是实际数据请求 获取时出错I: