spring - Spring MVC requestmapping handler方法中的{id :. +}是什么意思?

标签 spring spring-mvc

我在 Controller 中遇到了一个方法。这个 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));
}

最佳答案

spring MVC Controller 请求映射中路径变量的语法是{variable_name:regular_expression}。您可以选择省略正则表达式,这会导致您更频繁地看到 {id}

因此,对于示例 /index/{endpoint}/{type}/{id:.+},变量名称为 id,正则表达式为 .+(参见下面的 spring 文档引用)。

正则表达式 .+ 表示“匹配元字符 . 一次或多次”。这 '。'元字符表示包括空格在内的任何字符(尽管某些实现不匹配换行符)。见 http://en.wikipedia.org/wiki/Regular_expression

正则表达式用于帮助 Spring 确定变量的值,因为您可以有复杂的变量名称,或者路径末尾可能有其他重要信息,否则如果 Spring 只是说“一直到路径的末尾”(例如文件扩展名或路径变量)。

在您的示例中,id 变量可能包含特殊字符,否则会导致 Spring 过早终止该变量。在尝试使用包含文件扩展名(foobar.jpg)的文件名之前,我遇到过这个问题。 Spring 将仅返回变量的“foobar”部分,因为 Spring 假设我希望它在句点分隔符处终止变量值。因此,在这种情况下,为了确保“id”与完整值匹配,您放置了告诉 Spring 继续并匹配最后一个正斜杠和路径末尾之间的所有内容的正则表达式。引用:Spring MVC @PathVariable getting truncated

这是处理复杂变量匹配的 Spring 文档的摘录:

Sometimes you need more precision in defining URI template variables. Consider the URL "/spring-web/spring-web-3.0.5.jar". How do you break it down into multiple parts?

The @RequestMapping annotation supports the use of regular expressions in URI template variables. The syntax is {varName:regex} where the first part defines the variable name and the second - the regular expression."

这是他们的(相当复杂的)示例:

@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

他们提供的示例展示了如何执行从请求到 Controller 方法参数的复杂映射,如果不使用正则表达式,您将无法做到。

关于spring - Spring MVC requestmapping handler方法中的{id :. +}是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20527321/

相关文章:

spring - 这个 ClientAbortException 是从哪里来的?

java - Spring框架, Controller PreAuthorize中自定义函数

java - 在 Java、Spring MVC、Hibernate with Annotations Web 应用程序中设置 MySQL 用户变量的最佳方法是什么?

json - 使用通用 JSON 对象作为请求体

spring - 如何为运行测试设置默认的Spring Boot配置文件(不使用环境变量)?

java - Spring MVC中如何使用延迟加载

java - 如果在 Spring Data JPA 中为 null 或为空,如何在 @Query 中跳过 @Param

java - Spring Boot + Intellij Idea + Hibernate - 奇怪的堆栈跟踪

java - Spring启动Jsp文件找不到

java - 如何使用 Thymeleaf 将对象的 ID 添加到表单的隐藏输入