在我的应用程序中,我遇到了一种情况,即 spring mvc 始终选择错误的控制器方法来执行。下面 spring 的调试日志显示了问题,它找到了两个匹配项,一个用于我的通用处理所有映射到的非手动映射控制器,/api/**
一个用于我正在寻找的实际东西api/companies/2/records/cabinets/FileTypes/50/1
spring mvc 然后选择/api/**
处理程序而不是它的更具体的处理程序成立。
我对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=[]}]