Spring Boot中@DateTimeFormat处理路径变量LocalDateTime返回null问题
问题分析与解决方案
你遇到的核心问题非常直接:控制器方法中的sdate和edate参数缺少@PathVariable注解,导致Spring无法将URL路径中的对应值绑定到这两个参数上,最终它们始终为null,触发了服务层的IllegalArgumentException: Value must not be null!。
修正后的控制器代码
把@PathVariable注解补充到sdate和edate参数上,同时指定对应的路径变量名称(和@RequestMapping中的占位符对应):
@RequestMapping(value = "/api/v1/climates/locationdates/{location}/{sdate}/{edate}", method = RequestMethod.GET) public ResponseEntity<Object> getClimate( @PathVariable("location") long location, @PathVariable("sdate") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime sdate, @PathVariable("edate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime edate) { System.out.println("CONTROLLER location is " + location + " start is " + sdate + " end is " + edate); return new ResponseEntity<>(climateService.getClimatesByLocationAndDates(location, sdate, edate), HttpStatus.OK); }
为什么会出现这个问题?
你在@RequestMapping的路径中定义了{sdate}和{edate}两个路径占位符,但在方法参数中只给location加了@PathVariable,却没给另外两个日期参数加。Spring的参数绑定规则是:
- 没有注解的参数,默认会尝试从**请求参数(即URL中
?后面的键值对)**中取值 - 而你的curl请求是把日期放在路径里,不是请求参数,所以Spring找不到对应的值,自然就把
sdate和edate设为null了
至于你尝试的@DateTimeFormat格式配置本身是没问题的,只要加上@PathVariable,Spring就能按照你指定的格式把路径中的字符串转换成LocalDateTime对象。
额外验证建议
修正后,你可以再用原来的curl请求测试,此时控制器日志应该能正确打印出sdate和edate的具体值,不会再出现null的情况,接口也能正常返回数据。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

