Java Spring中如何处理所有未配置专属映射的请求地址
未定义映射路径统一处理方案
Spring MVC的路径匹配本身有优先级规则:精确匹配优先级高于通配符匹配,因此你已经定义的/、/admin这类精确映射不会被通用规则干扰,以下是两种常用实现方式:
方案1:通配符路径映射(无需额外配置)
直接新增一个通配符规则的接口即可,写法最简单:
- 如果只需要匹配单层路径的未映射地址(比如
/asdf这类根路径下的不存在地址),用/*:
@GetMapping("/*") public String handleSingleLevelUnmappedPath() { // 替换为你需要转发的目标页面视图名 return "not-found"; }
- 如果需要匹配所有层级的未映射地址(比如
/a/b/c、/user/test/123这类多层路径下的不存在地址),用/**:
@GetMapping("/**") public String handleAllLevelUnmappedPath() { // 替换为你需要转发的目标页面视图名 return "not-found"; }
注意:该方案默认只处理GET类型的未映射请求,如果需要覆盖POST、PUT、DELETE等其他请求方法,可以将
@GetMapping替换为@RequestMapping("/**"),该注解默认支持所有HTTP请求方法。
方案2:全局异常捕获(覆盖所有请求方法)
如果需要统一处理所有请求方法的未映射路径,可以通过捕获NoHandlerFoundException实现,需要先修改配置开启相关开关:
- 添加配置项
如果是application.yml格式配置:
如果是spring: mvc: throw-exception-if-no-handler-found: true web: resources: add-mappings: falseapplication.properties格式配置:spring.mvc.throw-exception-if-no-handler-found=true spring.web.resources.add-mappings=false - 编写全局异常处理逻辑
@ControllerAdvice public class GlobalWebExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) public String handleNoExistPath() { // 替换为你需要转发的目标页面视图名 return "not-found"; } }
注意:该方案关闭了默认的静态资源自动映射,如果你项目里有静态资源(css、js、图片等)需要访问,需要额外配置静态资源的放行规则,避免静态资源被拦截。
内容的提问来源于stack exchange,提问作者Matan
相关产品推荐
相关产品推荐

