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
相关产品推荐
相关产品推荐

