向Spring Boot后端传递含点号的参数字符串时出错
这个问题我之前遇到过,核心原因是Spring Boot默认的路径匹配规则会把路径变量里的点号当作文件扩展名的分隔符,所以会自动截断点号后面的内容,导致你拿到不完整的form_name参数。下面给你几个可行的解决方法:
方法1:修改控制器路径,明确匹配所有字符
最简单直接的方式是在你的路径变量form_name后面加上正则表达式.+,告诉Spring要匹配该位置的所有字符(包括点号)。修改你的控制器映射路径:// 原来的路径:"/metadata/{level1}/{level2}/{form_name}" // 修改后: @RequestMapping("/metadata/{level1}/{level2}/{form_name:.+}") public ResponseEntity<?> getMetadata( @PathVariable String level1, @PathVariable String level2, @PathVariable String form_name ) { // 你的业务逻辑代码 }这样配置后,Spring就会完整捕获
form_name里的所有字符,包括点号和后面的内容,不需要修改前端代码,这是最推荐的方案。方法2:全局关闭后缀匹配
如果你的项目里有很多类似的路径变量需要处理,可以全局配置Spring的路径匹配规则,关闭后缀识别。在Spring Boot 2.x及以上版本,可以添加一个配置类:import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // 关闭后缀匹配,不识别路径中的文件扩展名 configurer.setUseSuffixPatternMatch(false); // 同时可以关闭后缀匹配的大小写忽略,按需选择 configurer.setUseRegisteredSuffixPatternMatch(false); } }这个配置会全局生效,所有路径变量里的点号都会被完整保留,适合多个接口都有类似需求的场景。
方法3:前端对参数进行URL编码
如果暂时无法修改后端代码,也可以在前端调用API前对returnName参数进行URL编码,把点号转成%2E。修改你的前端axios调用代码:static GetMetaDataInfo(returnName) { // 对returnName进行URL编码 const encodedReturnName = encodeURIComponent(returnName); return axios.get(`${ROOT_URL}/api/v1/filing-metadata/metadata/${encodedReturnName}`, { headers: { 'Content-Type': 'application/json', } }) .then(response => response.data) .catch(error => console.log(error)); }不过这种方法需要注意:后端拿到编码后的参数后,Spring会自动对URL编码的路径变量进行解码,所以你不需要额外处理,直接拿到的就是原始的
NV_TXR-02.01。
验证建议
测试修改后的调用:当传入US\NV\NV_TXR-02.01时,不管用哪种方法,后端的form_name参数都应该能完整接收到NV_TXR-02.01,数据库查询就能正常匹配了。
内容的提问来源于stack exchange,提问作者Vangjel

