Spring Rest 控制器从查询参数中的 zonedatetime 中删除加号

Rob*_*rto 4 java controller spring-boot zoneddatetime

我有UT,顺利通过

    @Test
    public void test() {
        String text1 = "2009-07-10T14:30:01.001Z";
        String text2 = "2009-07-10T14:30:01.001+03:00";
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ");

        ZonedDateTime zonedDateTime1 = ZonedDateTime.parse(text1, f);
        ZonedDateTime zonedDateTime2 = ZonedDateTime.parse(text2, f);

        System.out.println(zonedDateTime1);
        System.out.println(zonedDateTime2);
    }
Run Code Online (Sandbox Code Playgroud)

输出是

2009-07-10T14:30:01.001Z
2009-07-10T14:30:01.001+03:00
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在 spring-controller 上使用这种模式时

    @GetMapping
    public ResponseEntity get( @RequestParam("start") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ")
                                               ZonedDateTime start) {
        Dto result = service.get(start);
        return new ResponseEntity(result, getHeaders(), HttpStatus.OK);
    }
Run Code Online (Sandbox Code Playgroud)

例如,仅当我传递 Z 而不是时区时,它才有效

2009-07-10T14:30:01.001Z
Run Code Online (Sandbox Code Playgroud)

但是当尝试传递时区偏移时 - 出现错误消息

“无法将类型“java.lang.String”的值转换为所需类型“java.time.ZonedDateTime”;嵌套异常为 org.springframework.core.convert.ConversionFailedException:无法从类型 [java.lang.String] 转换输入 [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.ZonedDateTime] 获取值 '2009-07-10T14:30:01.001 03:00';嵌套异常是 java.lang.IllegalArgumentException:解析尝试失败的值 [2009-07-10T14:30:01.001 03:00]”,

我尝试像这样通过邮递员传递请求

POST localhost:9080/MyApp/user?start=2009-07-10T14:30:01.001+03:00
header: Content-Type application/json
Run Code Online (Sandbox Code Playgroud)

Dea*_*ool 5

当您有特殊字符(例如加号())时,您必须对url进行编码+

POST localhost:9080/MyApp/user?start=2009-07-10T14:30:01.001%2B03:00
Run Code Online (Sandbox Code Playgroud)