spring boot需启用spring.mvc.throw-exception-if-no-handler-found=true并禁用静态资源映射才能捕获nohandlerfoundexception,再通过@restcontrolleradvice统一处理404;若禁用add-mappings需手动配置swagger资源路径或改用springdoc,也可继承basicerrorcontroller定制响应。

Spring Boot 默认不抛出 NoHandlerFoundException,而是静默返回 404 响应,所以直接用 @ExceptionHandler(NoHandlerFoundException.class) 是捕获不到的。要真正捕获它,必须先启用“找不到处理器时主动抛异常”机制,并禁用默认的静态资源处理器干扰。
启用 NoHandlerFoundException 抛出
在 application.properties 中添加:
spring.mvc.throw-exception-if-no-handler-found=truespring.resources.add-mappings=false
前者让 DispatcherServlet 在无匹配 handler 时抛出 NoHandlerFoundException;后者关闭 Spring Boot 自动注册的 ResourceHttpRequestHandler——否则该 handler 会兜底处理所有未映射路径(包括不存在的 API),导致永远不触发异常。
全局捕获并统一响应
使用 @RestControllerAdvice 捕获该异常:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ApiResponse<string> handle404(NoHandlerFoundException e) {
return ApiResponse.error(404, "请求地址不存在:" + e.getRequestURL());
}
}</string>
注意:需配合自定义的统一响应体(如 ApiResponse)保证前后端格式一致,避免返回 Spring Boot 默认的 error JSON 结构。
兼容 Swagger 静态资源
禁用 add-mappings 后,Swagger UI 的 JS/CSS 资源会 404。需手动注册 Swagger 资源路径:
- 若用 Swagger2:
registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); - 若用 SpringDoc OpenAPI(推荐):
springdoc.swagger-ui.path=/swagger-ui.html即可,它不依赖add-mappings,无需额外配置
更稳妥的做法是只禁用静态资源映射,但保留 Swagger 所需路径,而非全局关掉。
替代方案:用 BasicErrorController 定制
不改配置也能干预 404 行为。继承 BasicErrorController 并重写 errorHtml() 和 error() 方法,返回自定义视图或 JSON。这种方式无需改动全局配置,适合已有项目平滑接入,但灵活性略低于异常捕获方式。










