使用 LocalDate 类型参数发送请求

Posted

技术标签:

【中文标题】使用 LocalDate 类型参数发送请求【英文标题】:Sending requests with LocalDate type parameters 【发布时间】:2018-11-10 13:38:09 【问题描述】:

我想这样发送请求:

http://localhost:8080/reports/daily?start_date=2018-03-22&end_date=2018-03-24

我有一个错误:

“2018-05-31 15:40:29.623 WARN 11496 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : 绑定请求失败 元素: org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: 无法将“java.lang.String”类型的值转换为所需类型 'java.time.LocalDate';嵌套异常是 org.springframework.core.convert.ConversionFailedException: 失败 从类型 [java.lang.String] 转换为类型 [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] 的值'2018-03-22';嵌套异常是 java.lang.IllegalArgumentException:值的解析尝试失败 [2018-03-22] "

问题很明显,所以我找到了解决方案并更改了所有内容。我的方法:

@RequestMapping(path = "reports/daily", method = RequestMethod.GET, 
                consumes = MediaType.APPLICATION_JSON_VALUE)
public String getDailyReport(@RequestParam ("start_date") 
                             @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
                             LocalDate startDate, 
                             @RequestParam("end_date") 
                             @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
                             LocalDate endDate) 
    double totalDistance = 0.0;
    double totalPrice = 0.0;
    List<Transit> transits = transitService.getTransits(startDate, endDate);
    for (Transit transit : transits) 
        if (transit.getDistance() != null && transit.getPrice() != null) 
            try 
                totalDistance = totalDistance + transit.getDistance();
                totalPrice = totalPrice + transit.getPrice();
             catch (NullPointerException e) 
                e.fillInStackTrace().getMessage();
            
        
    
    return "Total distance " + totalDistance + ", total price: " + totalPrice;

对我来说一切似乎都很好,我还在 pom 文件中添加了所需的依赖项。

【问题讨论】:

【参考方案1】:

我怀疑问题出在这里:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)

根据the docsDATE_TIME是日期和时间:

最常见的 ISO 日期时间格式yyyy-MM-dd'T'HH:mm:ss.SSSZ,例如“2000-10-31T01:30:00.000-05:00”。

2018-03-22 的参数看起来不是这样。而是使用

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)

最常见的 ISO 日期格式yyyy-MM-dd,例如“2000-10-31”。

start_dateend_date 也是如此。

【讨论】:

以上是关于使用 LocalDate 类型参数发送请求的主要内容,如果未能解决你的问题,请参考以下文章

如何通过扫描仪将 LocalDate 类型作为参数传递?

如何在 WCF 中将 Noda Time(或任何第三方类型)对象作为参数传递?

Spring MVC 接收请求参数所有方式总结!

最强总结:Spring MVC 接收请求参数的所有方式!

如何使用 JPA 持久化 LocalDate?

在邮递员中获取接受参数的请求,当前发送不支持的媒体类型错误