【发布时间】:2013-05-15 13:52:00
【问题描述】:
在我的应用程序中,我遇到了一种情况,即 spring mvc 始终选择错误的控制器方法来执行。下面spring的调试日志显示了问题,它找到了两个匹配项,一个用于我的通用处理所有非手动映射控制器,它映射到/api/**,一个用于我正在寻找的实际东西api/companies/2/records/cabinets/FileTypes/50/1 spring mvc 然后选择@987654323 @handler 覆盖它找到的更具体的处理程序。
我对spring的理解是,如果一个请求映射有两个匹配,那么spring会选择url较长的handle方法。为什么 spring mvc 选择较短的映射?
给定以下映射:
-
/api/companies/{id}/records/cabinets/FileTypes/{fileTypeId}/{versionId}映射到方法1 -
/api/**映射到方法2
以及路径api/companies/2/records/cabinets/FileTypes/50/1 spring mvc 应该选择什么作为上述两个 url 的处理程序方法。
这里是调试日志中的相关行。
17:58:49,858 DEBUG [DispatcherServlet] DispatcherServlet with name 'main' processing PUT request for [/web/api/companies/2/records/cabinets/FileTypes/50/1]
17:58:49,858 TRACE [DispatcherServlet] Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@2b25f2be] in DispatcherServlet with name 'main'
7:58:49,858 DEBUG [RequestMappingHandlerMapping] Looking up handler method for path /api/companies/2/records/cabinets/FileTypes/50/1
17:58:49,859 TRACE [RequestMappingHandlerMapping] Found 2 matching mapping(s) for [/api/companies/2/records/cabinets/FileTypes/50/1] : [{[/api/**],methods=[PUT],params=[],headers=[],consumes=[],produces=[],custom=[]}, {[/api/companies/{id}/records/cabinets/FileTypes/{fileTypeId}/{versionId}],methods=[PUT],params=[],headers=[],consumes=[],produces=[],custom=[]}]
【问题讨论】:
-
你是如何尝试这个的?我使用 `@RequestMapping(value="[mapping]") 测试了四种不同的映射,每个映射都按预期工作。我使用了'something/**'、'something/*'、'something/'和'something/else',并且每个都按预期工作(使用'something/more specific'、'something/specific'、'something/ ' 和 'something/else')。
标签: spring spring-mvc