背景
spring-boot的版本是2.1.4.RELEASE,spring的版本是5.1.6.RELEASE
一个例子如下:
@Configuration @Import(WebMvcAutoConfiguration.EnableWebMvcConfiguration.class) @SuppressWarnings("unchecked") public class WebConfig implements WebMvcConfigurer, WebMvcRegistrations { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { return new RequestMappingHandlerMapping(); } } @RestController public class ParamController { @GetMapping(value = "/param/{param1}") public String param(@PathVariable("param1") String param1) { return param1; } } @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
启动一下,访问 http://127.0.0.1:8080/param/hehe
和 http://127.0.0.1:8080/param/hehe.hehe
都返回 hehe
如果访问 http://127.0.0.1:8080/param/hehe.hehe.hehe
,它会返回 hehe.hehe
所以会发现它把最后一个小数点后面的字符给截掉了,那如果我们想要获取完整的字符串,该怎么办呢?
探索
- 参数怎么来的
入口在 InvocableHandlerMethod.invokeForRequest
,如下:
是根据 PathVariableMethodArgumentResolver.resolveName
得来的,如下:
HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";
什么时候放进 attributes
里的?,在 RequestMappingInfoHandlerMapping.handleMatch
,如下: