我必须支持以下网址格式
/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);
}
看起来斜线和点的组合不适用于上述解决方案。
对于不匹配的Accept标头,我不断获得406
,或404
答案 0 :(得分:2)
最动态的方法是使用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
提取所有地址在这个级别,你拥有所需的一切。
答案 1 :(得分:1)
你能试试吗,
house_type
只需指定完整的正则表达式格式,其中您希望在url的末尾添加扩展名,例如atom,因为默认情况下,它将被Spring解释为MediaType。
另一种解决方案是指定接受的MediaTypes
@RequestMapping(value="/service/{country}/{city}/{addr:[a-z]+\\\\.(atom|otherExtensions)}")
如果未在Spring中预定义,则可以创建自定义MediaType。