URL端点路径参数含斜杠字符导致后端抛NotFoundException如何修复
问题解决方案
你遇到的是路径参数包含特殊字符/导致Spring路由匹配错误的问题,可根据实际业务场景选择以下任意一种方案修复:
方案1:调整路径匹配规则+前端参数编码
改动最小,不需要调整现有接口的请求方式:
- 前端侧:构造URL时对
invoice_number做URL编码,把/转义为%2F,修改代码如下:
var url = 'Url' + 'info/' + '/getInstallmentScheduleInfoList/' + encodeURIComponent(invoice_number);
- 后端侧:修改路径占位符的匹配规则,用正则匹配允许参数包含斜杠,同时手动解码参数即可:
@RequestMapping(value = "/getInstallmentScheduleInfoList/{installmentInvoiceNumber:.+}", method = RequestMethod.GET) public @ResponseBody List<RecordWrapper<InstallmentScheduleInfo>> getInstallmentScheduleInfoList(@PathVariable String installmentInvoiceNumber) { // 解码前端编码后的参数 installmentInvoiceNumber = URLDecoder.decode(installmentInvoiceNumber, StandardCharsets.UTF_8); // 后续沿用原有业务逻辑即可 }
该方案完全兼容原有GET请求的调用逻辑,不需要调整其他对接逻辑
方案2:改为Query参数传递
是最稳定的推荐方案,完全规避路径特殊字符问题:
- 前端侧:把参数从路径移到URL问号后缀中,修改代码如下:
var url = 'Url' + 'info/' + '/getInstallmentScheduleInfoList?installmentInvoiceNumber=' + encodeURIComponent(invoice_number);
- 后端侧:把
@PathVariable注解替换为@RequestParam,去掉路径中的参数占位符:
@RequestMapping(value = "/getInstallmentScheduleInfoList", method = RequestMethod.GET) public @ResponseBody List<RecordWrapper<InstallmentScheduleInfo>> getInstallmentScheduleInfoList(@RequestParam String installmentInvoiceNumber)
Spring会自动完成参数解码,不需要额外处理特殊字符
方案3:改为POST请求传递参数
如果参数还存在其他特殊字符、或者长度超过URL长度限制,可以直接调整为POST请求,把参数放到请求体中传递,完全规避URL特殊字符问题:
- 前端侧:调整为POST请求,把参数放到JSON请求体中发送
- 后端侧:调整请求方法为POST,用
@RequestBody接收参数即可
内容的提问来源于stack exchange,提问作者macqo
相关产品推荐
相关产品推荐

