我有以下映射:
@RequestMapping(value = "/{first}/**/{last}", method = RequestMethod.GET)
public String test(@PathVariable("first") String first, @PathVariable("last")
String last) {}
对于以下URI:
foo/a/b/c/d/e/f/g/h/bar
foo/a/bar
foo/bar
将 foo 映射到第一个和 bar 到最后并且正常工作。
我想要的是将foo和bar之间的所有内容映射到单个路径参数中的内容,如果没有中间内容则为null(如上一个URI示例中所示):
@RequestMapping(value = "/{first}/{middle:[some regex here?]}/{last}",
method = RequestMethod.GET)
public String test(@PathVariable("first") String first, @PathVariable("middle")
String middle, @PathVariable("last") String last) {}
因为我希望像{middle:。*}那样简单,只有 映射到/ foo / a / bar,或者{middle:(。* /) *},似乎没有映射。
在应用正则表达式模式之前,AntPathStringMatcher是否在“/”上进行标记? (制作跨越/不可能的模式)还是有解决方案?
仅供参考,这是在春季3.1M2
这似乎与@RequestMapping controllers and dynamic URLs相似,但我没有看到解决方案。
答案 0 :(得分:14)
在我的项目中,我在springframework中使用内部变量:
@RequestMapping(value = { "/trip/", // /trip/
"/trip/{tab:doa|poa}/",// /trip/doa/,/trip/poa/
"/trip/page{page:\\d+}/",// /trip/page1/
"/trip/{tab:doa|poa}/page{page:\\d+}/",// /trip/doa/page1/,/trip/poa/page1/
"/trip/{tab:trip|doa|poa}-place-{location}/",// /trip/trip-place-beijing/,/trip/doa-place-shanghai/,/trip/poa-place-newyork/,
"/trip/{tab:trip|doa|poa}-place-{location}/page{page:\\d+}/"// /trip/trip-place-beijing/page1/
}, method = RequestMethod.GET)
public String tripPark(Model model, HttpServletRequest request) throws Exception {
int page = 1;
String location = "";
String tab = "trip";
//
Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
if (pathVariables != null) {
if (pathVariables.containsKey("page")) {
page = NumberUtils.toInt("" + pathVariables.get("page"), page);
}
if (pathVariables.containsKey("tab")) {
tab = "" + pathVariables.get("tab");
}
if (pathVariables.containsKey("location")) {
location = "" + pathVariables.get("location");
}
}
page = Math.max(1, Math.min(50, page));
final int pagesize = "poa".equals(tab) ? 40 : 30;
return _processTripPark(location, tab, pagesize, page, model, request);
}
答案 1 :(得分:1)
据我所知,无法完成。正如您所说,正则表达式在每个斜杠分割路径后应用于路径元素,因此正则表达式永远不会匹配'/'。
您可以手动检查网址并自己从请求对象中解析它。
答案 2 :(得分:1)
可以通过编写自定义路径匹配器并配置Spring来使用它来完成。例如,此处记录了此类解决方案:http://java.dzone.com/articles/spring-3-webmvc-optional-path
该链接提供自定义路径匹配器,并显示如何配置spring以使用它。如果您不介意编写自定义组件,这应该可以解决您的需求。
的副本答案 3 :(得分:-1)
尝试使用此
@RequestMapping(value = {"some mapped address","some mapped address with path variable","some mapped address with another path variable"})
特定方法的可用网址数组列表
但是在你的方法签名中使用@PathVariable时要小心创建url列表,它不能为null。
希望这个帮助