Spring MVC中web.xml配置throwExceptionIfNoHandlerFound仍返回404问题
throwExceptionIfNoHandlerFound 配置不生效的常见原因及解决方案 常见原因
- 版本不兼容:
throwExceptionIfNoHandlerFound是Spring 4.0版本新增的配置参数,若项目依赖的Spring框架版本低于4.0,该配置不会生效。 - 开启了默认Servlet处理器:如果Spring MVC配置中开启了
<mvc:default-servlet-handler/>(XML配置)或注解配置类中注册了默认Servlet处理器,DispatcherServlet会将未匹配到Handler的请求转发给Web容器的默认Servlet处理,此时不会抛出NoHandlerFoundException,直接返回404状态。 - 全路径静态资源映射拦截:如果配置了
/**规则的静态资源映射,所有请求会优先匹配静态资源,未匹配到的请求会由静态资源处理器直接返回404,不会进入抛出异常的逻辑。 - 容器默认404拦截优先级更高:Tomcat等Web容器默认会捕获404状态码返回预设错误页,即使Spring抛出了
NoHandlerFoundException,也可能被容器提前拦截,表现为直接返回404页面。
解决方案
- 升级Spring框架依赖至4.0及以上版本
- 移除不必要的默认Servlet处理器配置
- 调整静态资源映射规则,避免使用
/**全路径匹配,建议将静态资源归类到统一路径下单独配置,例如仅映射/static/**路径下的静态资源 - 配置全局异常处理器捕获
NoHandlerFoundException,示例代码:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) public ResponseEntity<Map<String, Object>> handleNotFound(NoHandlerFoundException e) { Map<String, Object> resp = new HashMap<>(); resp.put("code", 404); resp.put("message", "请求路径不存在"); return new ResponseEntity<>(resp, HttpStatus.NOT_FOUND); } }
- 若使用Tomcat等容器,可在web.xml中配置自定义404错误页指向Spring的异常处理接口,避免容器提前拦截:
<error-page> <error-code>404</error-code> <location>/custom/404/handler</location> </error-page>
内容的提问来源于stack exchange,提问作者javaway
相关产品推荐
相关产品推荐

