Spring中LocalDate类型请求参数转换报错,调整后仍存问题
问题排查与解决方案
我一眼就看出问题所在了——你在日期格式化注解上用错了配置,这直接导致Spring无法正确解析你传入的纯日期参数!
核心错误分析
你给LocalDate类型的参数标注了@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME),但这个ISO格式对应的是带时间戳的完整日期时间字符串(比如2018-03-22T14:30:00),而你的请求参数是纯日期格式2018-03-22,完全不匹配。加上LocalDate本身只表示日期,不需要时间部分,所以这个注解配置完全不对。
修复步骤
1. 修正日期格式化注解
把@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)改成以下两种方式之一:
- 方式一:用ISO标准日期格式(推荐,正好匹配你的参数格式)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) - 方式二:直接指定日期格式字符串
@DateTimeFormat(pattern = "yyyy-MM-dd")
2. 移除多余的consumes属性
你的接口是GET请求,GET请求没有请求体,所以consumes = MediaType.APPLICATION_JSON_VALUE这个配置完全多余,甚至可能导致Spring对请求的解析逻辑出现异常,建议直接删掉。
修改后的完整代码
@RequestMapping(path = "reports/daily", method = RequestMethod.GET) public String getDailyReport( @RequestParam("start_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate, @RequestParam("end_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) 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 += transit.getDistance(); totalPrice += transit.getPrice(); } catch (NullPointerException e) { // 这里注意:原代码的e.fillInStackTrace().getMessage()写法有问题,建议改成 e.printStackTrace(); // 或者用日志框架记录异常信息 } } } return "Total distance " + totalDistance + ", total price: " + totalPrice; }
额外排查点(如果修复后仍有问题)
- 检查Spring Boot版本:确保你使用的Spring Boot版本是1.5及以上,这些版本原生支持Java 8的
LocalDate等时间API,不需要额外配置转换器。 - 清理冗余依赖:
spring-boot-starter-web已经包含了Java 8时间格式化所需的所有依赖,如果你额外添加了类似jackson-datatype-jsr310的依赖,可能会出现版本冲突,建议检查pom.xml并移除重复依赖。
内容的提问来源于stack exchange,提问作者D.Zet
相关产品推荐
相关产品推荐

