Spring PathVariable绑定自动转小写,如何提取请求原始值?
如何获取@PathVariable绑定前的原始大小写值
这个问题挺有意思的——其实Spring MVC的@PathVariable默认是会保留URL中传入的原始大小写的,你遇到的自动转小写情况,大概率是项目里的某些配置或者自定义逻辑导致的。下面给你两种解决思路:
方案1:修复全局路径匹配配置(推荐)
这种自动转小写的情况,最常见的原因是项目配置了大小写不敏感的路径匹配器,导致Spring在匹配路径时自动将路径片段转成了小写。你可以通过调整配置恢复默认的大小写敏感行为:
如果使用AntPathMatcher(Spring Boot 2.6之前默认,或手动配置)
在配置类中确保路径匹配器开启大小写敏感(这其实是默认值,但如果之前被修改过,需要重置):
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Bean public AntPathMatcher antPathMatcher() { AntPathMatcher matcher = new AntPathMatcher(); matcher.setCaseSensitive(true); // 强制开启大小写敏感 return matcher; } }
如果使用PathPatternParser(Spring Boot 2.6+默认)
在application.properties或application.yml中添加配置:
spring.mvc.pathmatch.case-sensitive=true
配置生效后,@PathVariable就能直接拿到URL中传入的原始大小写值了。
方案2:直接从HttpServletRequest提取原始路径片段
如果不想修改全局配置,或者只需要在个别接口中获取原始值,可以绕过@PathVariable的绑定逻辑,直接从原始请求URI中截取:
@GetMapping("/company/{name}") public String getCompanyDetails(HttpServletRequest request, @PathVariable("name") String lowerCaseName) { // 获取完整请求URI,例如 "/company/AcmeCorp" String requestUri = request.getRequestURI(); // 截取"/company/"之后的部分,得到原始大小写的name值 String originalName = requestUri.substring(requestUri.indexOf("/company/") + "/company/".length()); // 现在originalName就是请求中传入的原始值,比如"AcmeCorp" return String.format("原始名称: %s, PathVariable绑定后的名称: %s", originalName, lowerCaseName); }
额外排查点
如果上面的方案都不生效,建议检查项目中是否存在自定义的String类型转换器/格式化器——比如实现了Converter<String, String>或Formatter<String>的类,可能在其中写了自动转小写的逻辑,只需要调整这些自定义逻辑的适用范围或者移除转小写代码即可。
内容的提问来源于stack exchange,提问作者akshay
相关产品推荐
相关产品推荐

