为何@GetMapping("/preferences")可匹配/preferences.somethinghere路径?
问题原因及解决办法
原因分析
你遇到的问题是Spring MVC默认的路径扩展名匹配策略导致的。在Spring Framework 4.3.x版本中,默认会开启后缀模式匹配(Suffix Pattern Matching):它会将URL中最后一个.之后的内容识别为文件扩展名,并且在匹配请求映射时自动忽略这个扩展名。因此/preferences.somethinghere会被框架解析为/preferences,自然就匹配到了你定义的接口,不会返回404。
解决办法
针对你的场景,有两种常见处理方式:
1. 完全关闭后缀模式匹配
通过自定义Web MVC配置,禁用后缀匹配功能,这样只有完全匹配/preferences的请求才会被处理,带任意后缀的请求都会返回404。
创建一个配置类继承WebMvcConfigurerAdapter(适配Java 7及Spring 4.x的接口实现):
@Configuration public class CustomWebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // 关闭后缀模式匹配 configurer.setUseSuffixPatternMatch(false); } }
2. 仅允许指定扩展名的匹配
如果你的接口需要支持特定扩展名(比如.json、.xml),可以开启注册后缀匹配模式,只允许已注册的媒体类型扩展名被识别,未注册的后缀会返回404:
@Configuration public class CustomWebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // 开启注册后缀匹配,仅允许已注册的扩展名 configurer.setUseRegisteredSuffixPatternMatch(true); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { // 注册允许的扩展名及对应的媒体类型 configurer.favorPathExtension(true) .mediaType("json", MediaType.APPLICATION_JSON) .mediaType("xml", MediaType.APPLICATION_XML); } }
这种配置下,/preferences.json或/preferences.xml能正常匹配接口,但/preferences.somethinghere会返回404。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

