RequestMapping包含斜杠和点

sid*_*ate 9 java regex spring spring-mvc

我必须支持以下URL格式

/service/country/city/addr1/addr2/xyz.atom /service/country/city/addr1/addr2/addr3/xyz.atom

where countrycitycan可以映射到@PathVariable但是之后路径可以是多个斜杠的动态.末端部分将具有.atom或类似.

我试过跟随,但没有一个选项似乎工作

  • 通配符

    @RequestMapping(value="/service/{country}/{city}/**")

  • 正则表达式

    @RequestMapping(value="/service/{country}/{city}/{addr:.+}")

  • UseSuffixPatternMatch


    Config类中的覆盖方法

     @Override
     public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
     }
    
    Run Code Online (Sandbox Code Playgroud)

看起来像斜线和点的组合不适用于上述解决方案.我一直在406寻找不匹配的Accept标头,或者404

Nic*_*tto 2

最动态的方法是用于MatrixVariable管理地址列表,但它不适用于您的上下文,因为据我从您的问题中了解到,路径无法修改。

管理动态路径的最佳方法是分两步进行:

  1. 设置 aRequestMapping提取除地址之外的所有数据
  2. 在方法中手动提取地址

所以第一步你会得到类似的东西:

    @RequestMapping(value="/service/{country}/{city}/**/{file}.atom")
    public String service(@PathVariable String country, 
         @PathVariable String city, @PathVariable String file,
         HttpServletRequest request, Model model) { 
Run Code Online (Sandbox Code Playgroud)

此映射与所有必需的路径匹配,并允许提取国家/地区、城市和文件名。

在第二步中,我们将使用提取的内容来获取地址,方法如下:

String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
path = path.substring(String.format("/service/%s/%s/", country, city).length(), 
                      path.length() - String.format("%s.atom", file).length());
String[] addrs = path.split("/");
Run Code Online (Sandbox Code Playgroud)
  1. 首先我们从请求中提取完整路径
  2. 然后我们删除已经提取的内容,即路径的开头和结尾
  3. 最后我们用它String.split来提取所有地址

在这个级别,您拥有所需的一切。