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

Spring Boot控制器提取路径中markerURI遇404问题求解

解决Spring MVC中提取完整markerURI路径参数的问题

问题背景

需要处理POST请求/books/123/markers/marker://big/yellow,提取完整的markerURI参数(格式为marker://markerType/markerValue,可能包含查询参数如marker://markerType/markerValue?attr1=val1&attr2=val2)。原控制器代码如下:

@PostMapping("/books/{id}/markers/{markerURI:^marker.*}") 
public void assignMarker(
    @PathVariable("id") String id,
    @PathVariable("markerURI") String markerURI
)

但请求返回404,且无法获取完整的markerURI字符串。

解决方案

方法1:修改路径变量的正则匹配规则

Spring MVC默认路径变量只会匹配到下一个/字符,原正则^marker.*只能匹配marker:部分,导致路径不匹配返回404。将正则改为.+(匹配任意非空字符,包括/)或更精确的marker://.*,即可完整捕获markerURI:

@PostMapping("/books/{id}/markers/{markerURI:.+}") 
public void assignMarker(
    @PathVariable("id") String id,
    @PathVariable("markerURI") String markerURI,
    @RequestParam(required = false) Map<String, String> queryParams
) {
    // markerURI会获取到marker://big/yellow(不带查询参数)
    // queryParams可获取?后的参数键值对
}

方法2:使用通配符+HttpServletRequest获取完整内容

如果需要获取包含查询参数的完整markerURI字符串(如marker://markerType/markerValue?attr1=val1&attr2=val2),可以用/**匹配剩余路径,再通过HttpServletRequest拼接路径和查询参数:

@PostMapping("/books/{id}/markers/**") 
public void assignMarker(
    @PathVariable("id") String id,
    HttpServletRequest request
) {
    String fullPath = request.getRequestURI();
    // 截取/markers/之后的路径部分
    String markerPath = fullPath.substring(fullPath.indexOf("/markers/") + 9);
    // 拼接查询参数
    String queryString = request.getQueryString();
    String fullMarkerURI = queryString != null ? markerPath + "?" + queryString : markerPath;
}

说明

  • 方法1适合不需要合并查询参数的场景,查询参数可通过@RequestParam单独处理;
  • 方法2可以获取包含查询参数的完整markerURI字符串,满足硬性需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:15:36