You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:49