您面临的问题是由于 Spring 将 URI 中
点 (.)后面的
最后一部分解释为类似 .json 或 .xml 的
文件扩展名。所以当 Spring 尝试解析路径变量时,它会在遇到 URI 末尾的点 (.) 后截断其余数据。
注意: 仅当您将路径变量保留在 URI 末尾时才会发生这种情况。
例如,考虑 URI:
https://localhost/example/gallery.df/link.ar。
@RestController
public class CustomController {
@GetMapping("/example/{firstValue}/{secondValue}")
public void example(@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
}
}
在上述的URL中,firstValue = "gallery.df",secondValue = "link",当解释路径变量时,点号后面的部分会被截断。
因此,有两种可能的方法来防止这种情况发生:
1. 使用正则表达式映射
在映射的结尾部分使用正则表达式。
@GetMapping("/example/{firstValue}/{secondValue:.+}")
public void example(
@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
}
使用 + 号表示点之后的所有值都将成为路径变量的一部分。
2.) 在 @PathVariable 后面添加斜杠
@GetMapping("/example/{firstValue}/{secondValue}/")
public void example(
@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
}
这将保护我们的第二个变量不受Spring的默认行为影响。
3) 通过覆盖Spring的默认webmvc配置
Spring提供了一种通过使用注解@EnableWebMvc来覆盖导入的默认配置的方式。我们可以通过在应用程序上下文中声明自己的DefaultAnnotationHandlerMapping bean并将其useDefaultSuffixPattern属性设置为false来自定义Spring MVC配置。
示例:
@Configuration
public class CustomWebConfiguration extends WebMvcConfigurationSupport {
@Bean
public RequestMappingHandlerMapping
requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping
= super.requestMappingHandlerMapping();
handlerMapping.setUseSuffixPatternMatch(false);
return handlerMapping;
}
}
请注意,覆盖此默认配置会影响所有的URL。
值得注意的是:我们在扩展WebMvcConfigurationSupport类以覆盖默认方法。还有一种方式可以通过实现WebMvcConfigurer接口来重写默认配置。
更多细节,请参阅:
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html。