Java如何捕获404异常?

在Java Web开发中捕获404异常,可通过以下方式实现:,1. 使用Spring框架时,通过@ControllerAdvice配合@ExceptionHandler(NoHandlerFoundException.class)全局处理。,2. 在Servlet应用中配置web.xml的“标签指定404错误处理器。,3. 通过过滤器或拦截器检查响应状态码,对HttpServletResponse.SC_NOT_FOUND(404)进行拦截处理。

在Java Web应用中,404状态码表示客户端请求的资源不存在,作为开发者,捕获并优雅处理404异常能提升用户体验和系统可维护性,以下是几种主流实现方案:

Java如何捕获404异常?

Spring MVC 全局异常处理(推荐)

通过@ControllerAdvice@ExceptionHandler实现:

@ControllerAdvice
public class GlobalExceptionHandler {
    // 捕获NoHandlerFoundException(需配合配置启用)
    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<Object> handle404(NoHandlerFoundException ex) {
        Map<String, Object> body = new LinkedHashMap<>();
        body.put("timestamp", LocalDateTime.now());
        body.put("message", "资源不存在");
        return new ResponseEntity<>(body, HttpStatus.NOT_FOUND);
    }
}

关键配置(在application.properties中):

spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false

Servlet容器级错误页面(传统Web项目)

web.xml中定义错误页面:

Java如何捕获404异常?

<error-page>
    <error-code>404</error-code>
    <location>/error/404.html</location>
</error-page>

创建对应的HTML文件:

<!-- /WEB-INF/views/error/404.html -->
<h1>404 错误</h1>
<p>您访问的页面不存在</p>

Spring Boot自定义ErrorController

实现ErrorController接口处理所有错误:

@RestController
public class CustomErrorController implements ErrorController {
    @RequestMapping("/error")
    public ResponseEntity<Map<String, Object>> handleError(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == 404) {
            return ResponseEntity.status(404)
                .body(Map.of("error", "Not Found", "path", request.getRequestURI()));
        }
        return ResponseEntity.status(500).body(Map.of("error", "Server Error"));
    }
}

前端控制器兜底方案

在DispatcherServlet中配置默认处理器:

Java如何捕获404异常?

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/**")
                .setStatusCode(HttpStatus.NOT_FOUND)
                .setViewName("forward:/error/404");
    }
}

最佳实践建议

  1. 优先级选择
    • Spring Boot项目优先使用@ControllerAdvice
    • 纯Servlet项目用web.xml配置
  2. 日志记录:在处理器中添加日志记录404请求路径
  3. 友好响应
    • REST API返回JSON格式错误信息
    • 网页应用返回定制化HTML页面
  4. 重定向处理:避免将404重定向到首页(可能导致SEO问题)

注意事项

  • Tomcat默认跳过小于400字节的404响应(可通过server.error.whitelabel.enabled=false关闭默认白页)
  • 确保静态资源路径配置正确,避免误报404

引用说明
本文解决方案参考Oracle官方Servlet规范文档、Spring Framework 5.3.x异常处理文档及Spring Boot 2.7.x错误处理机制,关键配置项依据Spring官方GitHub示例代码验证。

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/35046.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月22日 09:48
下一篇 2025年6月22日 09:58

相关推荐

  • Java如何实现多文件并发下载的高效方法?

    在Java中可通过多线程或异步任务实现多文件同时下载,常用方法包括使用线程池(ExecutorService)管理并发下载任务,或借助CompletableFuture进行异步处理,结合URLConnection或HttpClient获取文件流并写入本地,需注意网络IO阻塞及资源释放问题。

    2025年5月28日
    500
  • Java如何随机获取数组下标?

    在Java中随机获取数组下标,常用Random.nextInt(array.length)或(int)(Math.random() * array.length),前者通过Random类生成范围在0到length-1的整数;后者利用Math.random()乘以数组长度后取整,同样确保下标不越界。

    2025年6月7日
    200
  • 怎样轻松创建Java图形界面项目?

    创建Java图形界面工程:使用Swing或JavaFX库,在IDE中新建项目,设计界面组件并绑定事件处理逻辑,最后编译运行测试。

    2025年6月13日
    000
  • Java负数如何转正数

    在Java中,将负数转为正数可通过Math.abs()方法实现,该方法返回参数的绝对值,例如Math.abs(-5)结果为5,也可用取负操作(如-n),但需注意Integer.MIN_VALUE取负会溢出,推荐优先使用Math.abs()。

    2025年6月18日
    100
  • Java如何创建窗口?

    在Java中创建窗口通常使用Swing的JFrame或JavaFX的Stage类,Swing通过继承JFrame并设置可见性实现,JavaFX则需继承Application类并重写start方法,两者都能实现跨平台GUI窗口。

    2025年6月14日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN