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

Spring Boot+Thymeleaf中@PathVariable传参遇String转Long错误

问题修复方案

核心问题

你遇到的400错误本质是路由匹配冲突:

  • 控制器定义了@GetMapping("/racun/new/{type}/{city}")(路径变量传参)
  • 但Thymeleaf模板用了查询参数方式生成链接,最终URL是/racun/new?type=Čistoća&city=Rijeka
  • 这个URL会被/racun/{id}接口拦截,Spring试图把路径中的new转成Long类型的id,直接触发类型转换异常。

修复步骤

1. 修正Thymeleaf链接生成逻辑

把查询参数写法改成路径变量格式,Thymeleaf中用括号传递路径变量的值:

<!-- 错误写法(查询参数) -->
<a th:href="@{/racun/new(type='Čistoća', city='Rijeka')}">新建账单</a>

<!-- 正确写法(路径变量) -->
<a th:href="@{/racun/new/{type}/{city}(type='Čistoća', city='Rijeka')}">新建账单</a>

这样生成的URL会是/racun/new/Čistoća/Rijeka,完美匹配你定义的路径变量接口。

2. 加固路由避免后续冲突

如果项目中存在@GetMapping("/racun/{id}")这类接口,建议做两个优化:

  • 调整路由顺序:把/racun/new/{type}/{city}的定义放在/racun/{id}之前,Spring MVC会优先匹配更具体的路由。
  • 添加正则约束:给id参数加上数字匹配正则,确保只有数字ID才会触发该接口:
// 原写法
@GetMapping("/racun/{id}")
public String getBillById(@PathVariable Long id) { ... }

// 优化后
@GetMapping("/racun/{id:\\d+}")
public String getBillById(@PathVariable Long id) { ... }

这样非数字的路径片段(比如new)就不会被误匹配到这个接口。


内容的提问来源于stack exchange,提问作者user13372981

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:28:33