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

Spring Boot MVC GET控制器PathVariable含点号参数丢失问题咨询

解决Spring Boot 1.5.7中@PathVariable丢失文件后缀的问题

这种情况在Spring Boot 1.x版本里挺常见的——默认的路径匹配策略会把URL末尾的后缀当成Accept请求头对应的媒体类型处理,这就是你拿到的fileName只剩test、丢失.docx后缀的原因。下面给你几个靠谱的解决办法:

方法1:关闭后缀匹配规则(最省心的方案)

直接修改Spring的路径匹配配置,让它不再把后缀当成媒体类型解析,这样原始的控制器代码不用改就能拿到完整文件名。

方式A:通过配置文件修改

在application.properties里添加这两行配置:

spring.mvc.pathmatch.use-suffix-pattern=false
spring.mvc.pathmatch.use-registered-suffix-pattern=false

方式B:通过Java配置类修改

如果习惯用代码配置,可以写一个Web配置类:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false)
                  .setUseRegisteredSuffixPatternMatch(false);
    }
}

配置完成后,直接用原来的@GetMapping("/{id}/{fileName}")就能完整获取test.docx了。

方法2:修正PathVariable的正则表达式(针对你之前的尝试优化)

你之前用{**fileName:.***}的思路方向对,但写法有问题:**是用来匹配多级路径的(比如/a/b/c),这里只需要单级文件名,而且正则表达式写错了。

把控制器的GetMapping改成这样:

@GetMapping(value = "/{id}/{fileName:.+}")
@ResponseStatus(HttpStatus.OK)
public Response getDocument(@PathVariable Long id, @PathVariable String fileName) {
    // 这里就能拿到完整的test.docx了
}

这里的.+表示匹配一个或多个任意字符(包括点),刚好能覆盖带后缀的文件名。之前出现406错误,是因为**的匹配规则和Spring的媒体类型解析逻辑冲突,改成.+就不会触发这个问题了。

方法3:排查Response的返回格式(针对406错误的额外检查)

如果上面的方法还是出现406,那要确认你的Response类是否能被Spring正确转换为请求头Accept指定的格式(比如JSON):

  • 如果控制器没加@RestController,记得给方法加上@ResponseBody注解;
  • 检查是否引入了Jackson相关依赖(Spring Boot默认会引入,要是手动排除了就会导致无法序列化对象)。

内容的提问来源于stack exchange,提问作者Chetan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:08:53