SpringBoot Controller中RequestMapping正则匹配子目录问题求助
解决Spring Boot @RequestMapping正则匹配子目录的问题
我来帮你搞定这个问题~你遇到的问题是因为Spring MVC里@RequestMapping的路径正则语法和普通正则的写法有差异,咱们一步步调整:
问题根源
你原来的写法{reg:\/(dir1|dir2)+}有几个小问题:
- 路径变量里不需要额外添加
\/,因为@RequestMapping的路径本身已经处理了URL的分隔符; - 正则里的
+是多余的——你要匹配的是单个dir1或dir2,不是重复多次的目录名; - Spring的路径变量正则格式是
{变量名:正则表达式},而你这里其实不需要捕获变量的话,直接匹配路径即可。
两种可行的解决方案
方案1:直接列举路径(最直观推荐)
如果只是匹配/dir1和/dir2两个路径,直接给value传一个数组就行,简单易懂不容易出错:
@RequestMapping(value = {"/dir1", "/dir2"}, method = RequestMethod.GET) public void getFile(HttpServletResponse response, HttpServletRequest request) throws IOException { // 你的业务逻辑代码 }
方案2:使用正则匹配(适合未来扩展更多目录)
如果以后可能要添加更多类似的目录名,用正则会更灵活。正确的写法是把正则直接写在路径变量里,不需要额外的分隔符:
@RequestMapping(value = "/{dir:dir1|dir2}", method = RequestMethod.GET) public void getFile(HttpServletResponse response, HttpServletRequest request, @PathVariable String dir) throws IOException { // 还可以通过@PathVariable拿到匹配的目录名(比如dir1或dir2) // 业务逻辑代码 }
这里的{dir:dir1|dir2}表示:匹配路径中的最后一段为dir1或dir2的请求,同时把这段路径值绑定到dir变量上(如果不需要这个变量,也可以写成{:dir1|dir2},不过保留变量名可读性更好)。
验证测试
启动Spring Boot应用后,访问http://localhost:8080/dir1或http://localhost:8080/dir2,就能成功触发getFile方法了。
内容的提问来源于stack exchange,提问作者LikeTomAndJerry
相关产品推荐
相关产品推荐

