使用LocalDate类型参数发送请求

时间:2018-05-31 13:55:29

标签: java spring date spring-boot localdate

我想发送这样的请求: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] .wsmsDefaultHandlerExceptionResolver:无法绑定请求元素:org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:无法将类型'java.lang.String'的值转换为必需类型'java.time.LocalDate';嵌套异常是org.springframework.core.convert.ConversionFailedException:无法从类型[java.lang.String]转换为键入值为'2018-03-22'的[@ org.springframework.web.bind.annotation.RequestParam @ org.springframework.format.annotation.DateTimeFormat java.time.LocalDate];嵌套异常为java.lang.IllegalArgumentException:Parse尝试失败的值[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 个答案:

答案 0 :(得分:4)

我怀疑问题出现在这里:

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)

根据the docs DATE_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相同。