我在控制器中遇到了一个方法。这是什么ID:。+ ??
@RequestMapping(value="/index/{endpoint}/{type}/{id:.+}", method=RequestMethod.POST, consumes=kContentType, produces=kProducesType)
@ResponseBody
public String indexData(@PathVariable(value="endpoint") String endpoint, @PathVariable(value="type") String type, @PathVariable(value="id") String id, @RequestBody String body, HttpServletRequest request) {
logger.debug("In web controller for endpoint " + endpoint);
return indexController.indexData(endpoint, type, id, body, getSecurityContextProvider(request));
}
答案 0 :(得分:23)
spring MVC控制器请求映射中的路径变量的语法是{variable_name:regular_expression}
。您可以选择省略正则表达式,这会导致您经常看到的内容{id}
。
因此,对于示例/index/{endpoint}/{type}/{id:.+}
,变量名称为id
,正则表达式为.+
(请参阅下面对spring docs的引用)。
正则表达式.+
表示“匹配元字符.
一次或多次”。 '。'元字符表示包括空格的任何字符(尽管某些实现与新行不匹配)。见http://en.wikipedia.org/wiki/Regular_expression
正则表达式用于帮助Spring确定变量的值,因为你可以拥有复杂的变量名,或者在路径的末尾可能还有其他重要的信息,如果只是Spring,它们会被吸入变量值说“直到路径的末尾”(例如文件名扩展名或路径变量)。
在您的示例中,id变量可能包含特殊字符,否则会导致Spring过早终止变量。我在尝试使用包含文件扩展名的文件名(foobar.jpg)之前遇到过这个问题。 Spring只返回变量的“foobar”部分,因为Spring假设我希望它在句点分隔符处终止变量值。因此,在这种情况下,为了确保“id”与完整值匹配,您将使用告诉Spring的正则表达式继续并匹配最后一个正斜杠和路径结尾之间的所有内容。参考:Spring MVC @PathVariable getting truncated
以下是处理复杂变量匹配的Spring文档的摘录:
有时您需要更精确地定义URI模板变量。考虑URL“/spring-web/spring-web-3.0.5.jar”。你如何将其分解为多个部分?
@RequestMapping注释支持在URI模板变量中使用正则表达式。语法是{varName:regex},其中第一部分定义变量名称,第二部分定义正则表达式。“
这是他们(相当复杂)的例子:
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) {
// ...
}
来源:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html
它们提供的示例显示了如何执行从请求到控制器方法参数的复杂映射,如果不使用正则表达式,则无法执行这些映射。