You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:03:15