如何在Spring中适配数量未知、无命名的路径变量并获取其列表?
当然可以实现这种需求!你当前的写法只能处理单个路径段的变量,要搞定任意数量路径节点的场景,我们可以用Spring自带的路径匹配规则加一点小技巧来实现,给你两种实用方案:
解决方案
方法一:通过请求对象解析完整路径
这种方式更灵活,能直接拿到所有路径节点:
首先修改你的@RequestMapping路径,用/**匹配所有后续的路径分段,然后借助HttpServletRequest获取路径并拆分:
import org.springframework.web.servlet.HandlerMapping; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @RequestMapping(value = "/**", method = RequestMethod.GET) public String getMethod(HttpServletRequest request) { // 获取当前请求匹配到的完整路径部分 String matchedPath = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); // 拆分路径为分段,过滤掉空字符串(避免开头的/导致第一个元素为空) List<String> ids = Arrays.stream(matchedPath.split("/")) .filter(segment -> !segment.isBlank()) .collect(Collectors.toList()); // 在这里处理你的ids列表逻辑 return "成功获取到" + ids.size() + "个ID:" + String.join(", ", ids); }
说明
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE是Spring提供的属性,能精准拿到当前请求匹配到的路径部分,不会包含域名、端口这些额外内容。- 过滤空字符串是必要的,因为路径以
/开头,拆分后第一个元素会是空值,需要剔除。
方法二:用通配符路径变量接收
如果你更倾向于用@PathVariable的方式接收,也可以通过通配符让Spring把所有后续路径作为一个字符串传入,再自行拆分:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @RequestMapping(value = "/{ids:**}", method = RequestMethod.GET) public String getMethod(@PathVariable("ids") String idsString) { // 拆分字符串得到所有ID List<String> ids = Arrays.stream(idsString.split("/")) .filter(segment -> !segment.isBlank()) .collect(Collectors.toList()); // 处理逻辑 return "处理结果:" + ids; }
说明
{ids:**}是Spring的Ant风格路径匹配规则,**表示匹配任意数量的路径分段(包括多个/分隔的部分),Spring会把这部分完整路径作为字符串传给idsString。- 同样需要过滤空字符串,避免拆分后出现无效元素。
注意事项
- 建议给这个接口加上更具体的前缀,比如
/items/**,避免它覆盖控制器中其他更具体的接口路径(比如如果有/detail接口,/**会优先匹配导致该接口无法访问)。 - 如果路径中可能包含特殊字符,记得处理编码问题,Spring默认会自动解码路径,但特殊场景下可能需要手动处理。
内容的提问来源于stack exchange,提问作者Andreea
相关产品推荐
相关产品推荐

