RequestMapping包含斜杠和点

时间:2016-03-14 14:23:03

标签: java regex spring spring-mvc

我必须支持以下网址格式

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

其中countrycity可以映射到@PathVariable,但之后路径可以是带有多个斜杠的动态路径。结尾部分将有.atom或类似。

我尝试过关注,但似乎没有任何选项正常工作

  • 通配符

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

  • 正则表达式

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

  • UseSuffixPatternMatch


    在Config类中重写方法

     @Override
     public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
     }
    

看起来斜线和点的组合不适用于上述解决方案。 对于不匹配的Accept标头,我不断获得406,或404

2 个答案:

答案 0 :(得分:2)

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

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

  1. 设置RequestMapping,提取除地址
  2. 以外的所有数据
  3. 使用方法
  4. 手动提取地址

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

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

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

    在第二步中,我们将使用已提取的内容通过执行以下操作来获取地址:

    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("/");
    
    1. 首先,我们从请求中提取完整路径
    2. 然后我们删除我们已经提取的内容,这是路径的开头和结尾
    3. 最后我们使用String.split提取所有地址
    4. 在这个级别,你拥有所需的一切。

答案 1 :(得分:1)

你能试试吗,

house_type

只需指定完整的正则表达式格式,其中您希望在url的末尾添加扩展名,例如atom,因为默认情况下,它将被Spring解释为MediaType。

另一种解决方案是指定接受的MediaTypes

@RequestMapping(value="/service/{country}/{city}/{addr:[a-z]+\\\\.(atom|otherExtensions)}")

如果未在Spring中预定义,则可以创建自定义MediaType。