带有斜线和点的 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
其中country
和city
可以映射到@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的主要内容,如果未能解决你的问题,请参考以下文章