Spring Boot 2.5.9升级3.3.1后PathVariable传空致无匹配端点问题
Spring Boot 3.3.1路径变量空值问题解决方案
问题原因
Spring Boot 3.x版本默认使用PathPatternParser替代了旧版的AntPathMatcher做路径匹配,新解析器默认不允许空路径段(比如//这种连续斜杠对应的空sId),导致这类请求直接匹配不到控制器端点——既进不了你写的null判断逻辑,也不会触发MissingPathVariableException(因为连映射都没匹配上,根本到不了参数解析环节)。
解决方法
方法1:修改路径匹配规则,允许空路径段
通过配置类调整PathPatternParser参数,让它允许空路径段匹配:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { PathPatternParser parser = new PathPatternParser(); // 开启允许空路径段 parser.setAllowEmptyPathSegments(true); configurer.setPathPatternParser(parser); } }
配置后,/devices/myCid/model//deviceList这类请求就能正常匹配到控制器方法,进入原有的null判断逻辑返回404。
方法2:捕获无匹配端点异常返回404
如果不想修改路径匹配规则,可通过全局异常处理器捕获NoHandlerFoundException,统一返回404:
- 先在配置文件中开启抛出无匹配端点异常:
spring.mvc.throw-exception-if-no-handler-found=true spring.web.resources.add-mappings=false
- 添加全局异常处理器:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) public ResponseEntity<Void> handleNoEndpointFound(NoHandlerFoundException ex) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } }
这种方式无需修改控制器逻辑,直接把所有无匹配的请求统一返回404,和旧版本行为一致。
方法3:调整控制器路径映射(适配空路径段)
给控制器方法添加匹配空sId的路径映射,同时把sId的required设为false:
@GetMapping({"/devices/{cId}/model/{sId}/deviceList", "/devices/{cId}/model//deviceList"}) public ResponseEntity<DeviceListDTO> getDeviceList( @PathVariable(required = true) final String cId, @PathVariable(required = false) final String sId) { if (cId == null || sId == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } // 原有业务逻辑 }
这种方式针对性强,但如果有多个类似路径需要适配,会比较繁琐。
方法4:切换回旧版路径匹配器(不推荐长期使用)
如果暂时不想适配新解析器,可切换回AntPathMatcher,但官方后续可能移除对它的支持,仅作为临时过渡方案:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setPathMatcher(new AntPathMatcher()); } }
内容的提问来源于stack exchange,提问作者Kaveen M.
相关产品推荐
相关产品推荐

