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
相关产品推荐
相关产品推荐

