java - 如何获取 Spring MVC 中路径剩余部分的路径变量?

标签 java spring spring-mvc

如何使最后一个路径变量成为剩余路径?我有这样的东西,但它没有受到打击:

@RequestMapping(value = "{storageId}/{repositoryId}/{path}/**",
                method = RequestMethod.PUT)
@RequestMapping(value = "{storageId}/{repositoryId}/{path}/**", method = RequestMethod.PUT)
public ResponseEntity upload(@PathVariable(name = "storageId") String storageId,
                             @PathVariable(name = "repositoryId") String repositoryId,
                             @PathVariable(name = "path") String path,
                             MultipartFile multipartFile)
        throws ...
{
   ...
}

在 Jersey ,我可以像这样轻松地做到这一点:

@Path("{storageId}/{repositoryId}/{path:.*}")

...但我必须将一些代码迁移到 Spring MVC。

问题是,如果我的网址是:

http://localhost:48080/storages/storage0/snapshots/org/foo/bar/metadata/metadata-foo/3.1-SNAPSHOT/metadata-foo-3.1-20161017.182007-1.jar

我的路径被截断为:

metadata/metadata-foo/3.1-SNAPSHOT/metadata-foo-3.1-20161017.182007-1.jar

这显然是不正确的,因为它应该是:

org/foo/bar/metadata/metadata-foo/3.1-SNAPSHOT/metadata-foo-3.1-20161017.182007-1.jar

欢迎任何建议!

最佳答案

使用 Spring 5 中开始出现的新匹配算法很容易。您只需使用 {*foo} 作为路径模式。

@RequestMapping(value = "{storageId}/{repositoryId}/{path}/{*rest}",
                method = RequestMethod.PUT)
public ResponseEntity upload(@PathVariable(name = "storageId") String storageId,
                             @PathVariable(name = "repositoryId") String repositoryId,
                             @PathVariable(name = "path") String path,
                             @PathVariable(name = "rest") String rest,
                             MultipartFile multipartFile)
        throws ...
{
   ...
}

这在 Webflux 中默认有效。使用 MVC,您必须使用 spring.mvc.pathmatch.matching-strategy=path_pattern_parser 打开 PathPattern 匹配器。我知道这将是 Spring Boot 2.6 中的默认设置。

关于java - 如何获取 Spring MVC 中路径剩余部分的路径变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40091229/

相关文章:

java - Cassandra datastax 给出错误 "All host(s) tried for query failed"

java - 创建 ServletContext 资源中定义的名称为 'hibernate4AnnotatedSessionFactory' 的 bean 时出错 [/WEB-INF/dispatcher-servlet.xml] :

java - Spring JUnit Mockito 单元测试 Controller 指定的类是一个接口(interface)

java - 如何在实体中制作唯一字​​段,但相对多对一实体?

java - 实体管理器 NULL - Spring MVC JPA

java - 如何使用java注释设置类属性的默认值

java - 多线程数组比较 - 将事件推送到线程?

Java程序计算字符串中每个字符出现的次数

java - 带有 Gradle 的 Liquibase - changeLogFile 路径的愚蠢问题

hibernate - 一起运行时 Maven Spring 测试失败,但单独成功(ehcache 关闭,IllegalTransactionStateException)