【问题标题】:RequestMapping with slashes and dot带有斜线和点的 RequestMapping
【发布时间】:2016-06-29 15:24:52
【问题描述】:

我必须支持以下网址格式

/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);
     }
    

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

【问题讨论】:

  • 请求评论拒绝投票的原因
  • 嗨,我尝试了您的第一个选项 RequestMapping(value="/service/{country}/{city}/**"),适用于带有多个斜杠的动态 URL
  • 406 与路径无关。看来您做对了,但您的控制器无法以所需格式提供内容。
  • @cralfaro 如果最后一个值有点,它对我不起作用

标签: java regex spring spring-boot spring-mvc


【解决方案1】:

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

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

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

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

    @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提取所有地址

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

【讨论】:

  • 感谢您的回答。这是我能得到的最接近的。唯一需要更改的是最后的扩展名,这在我的情况下是可变的。因此最终的请求映射看起来像@RequestMapping(value="/service/{country}/{city}/**/{addr}.{extn}")
【解决方案2】:

你可以试试这个,

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

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

另一种解决方案是指定接受的媒体类型

@RequestMapping(value="/service/{country}/{city}/{addr}", consumes = {MediaType.ATOM, MediaType...})

如果没有在 Spring 中预定义,您可以创建自定义 MediaType。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 2012-02-21
    • 2020-10-20
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多