使用自定义分隔符的Spring AntPathMatcher匹配行为异常疑问
问题原因说明
你的基础认知没有错误:默认配置的AntPathMatcher对于完全相等、不含Ant通配符的纯字母数字字符串,一定会返回true。你遇到的异常结果是对AntPathMatcher的构造参数含义、内部匹配逻辑不熟悉导致的,你遗漏的核心特性如下:
AntPathMatcher(String pathSeparator)构造方法的入参是自定义路径分隔符,该类执行匹配时不会直接对pattern和path做全量字符串相等判断,而是优先按你指定的分隔符将两个参数分别切割为路径片段数组,再逐片段对比匹配。AntPathMatcher内部切割字符串使用Spring自带的StringUtils.tokenizeToStringArray工具,该工具的分隔符参数是分隔符字符集合:你传入的字符串中每一个独立字符都会被当作单独的分隔符使用,而非将整个字符串作为一个整体分隔符。
你传入的构造参数"\\t"是Java转义字符串,实际包含两个独立字符:反斜杠\和小写字母t,也就是说字符串中所有出现\或者t的位置都会被当作路径分隔符切割,对应你的测试用例:
// 切割后pattern和path都得到片段数组 ["consen"],逐片段匹配相等,返回true new AntPathMatcher("\\t").match("consent", "consent"); // 切割后pattern和path都得到片段数组 ["consen", "reg"],返回false是Spring 5.3.x(Spring Boot 2.5.5对应Spring版本)在多字符分隔符场景下的已知兼容性问题,更换为单字符分隔符即可复现预期结果 new AntPathMatcher("\\t").match("consentreg", "consentreg");
解决方案
你可以根据业务需求选择以下处理方式:
- 如果你不需要自定义路径分隔符,直接使用无参构造方法创建
AntPathMatcher实例即可 - 如果你需要自定义路径分隔符,传入单字符的分隔符即可,避免传入多字符的分隔符触发兼容问题
内容的提问来源于stack exchange,提问作者Nikolas
相关产品推荐
相关产品推荐

