带有斜线和点的 RequestMapping

Posted

技术标签:

【中文标题】带有斜线和点的 RequestMapping【英文标题】:RequestMapping with slashes and dot 【发布时间】: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 如果最后一个值有点,它对我不起作用 请参考以下docs.spring.io/spring/docs/3.1.0.RELEASE/… 【参考方案1】:

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

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

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

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

    @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("/");
    首先我们从请求中提取完整路径 然后我们删除我们已经提取的内容,这里是路径的开头和结尾 最后我们使用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。

【讨论】:

以上是关于带有斜线和点的 RequestMapping的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中格式化为包含逗号和点的十进制数?

定义一个矩形和点的位置,判断点是否在矩形里面

@NumberFormat 接受逗号和点,如何在 InitBinder 中实现

javascript中0-255和点的IP地址验证[重复]

.append() 包含引号和点的内容的问题

如何在ggplot2中分别缩放线和点的大小