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

