`

Spring Boot中Web应用的统一异常处理

 
阅读更多

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。

选择一个之前实现过的Web应用(Chapter3-1-2)为基础,启动该应用,访问一个不存在的URL,或是修改处理内容,直接抛出异常,如:

@RequestMapping("/hello")
public String hello() throws Exception {
    throw new Exception("发生错误");
}

此时,可以看到类似下面的报错页面,该页面就是Spring Boot提供的默认error映射页面。


alt=默认的错误页面

统一异常处理

虽然,Spring Boot中实现了默认的error映射,但是在实际应用中,上面你的错误页面对用户来说并不够友好,我们通常需要去实现我们自己的异常提示。

下面我们以之前的Web应用例子为基础(Chapter3-1-2),进行统一异常处理的改造。

  • 创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型,最后将Exception对象和请求URL映射到error.html
@ControllerAdvice
class GlobalExceptionHandler {

    public static final String DEFAULT_ERROR_VIEW = "error";

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName(DEFAULT_ERROR_VIEW);
        return mav;
    }

}
  • 实现error.html页面展示:在templates目录下创建error.html,将请求的URL和Exception对象的message输出。
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title>统一异常处理</title>
</head>
<body>
    <h1>Error Handler</h1>
    <div th:text="${url}"></div>
    <div th:text="${exception.message}"></div>
</body>
</html>

启动该应用,访问:http://localhost:8080/hello,可以看到如下错误提示页面。


alt=自定义的错误页面

通过实现上述内容之后,我们只需要在Controller中抛出Exception,当然我们可能会有多种不同的Exception。然后在@ControllerAdvice类中,根据抛出的具体Exception类型匹配@ExceptionHandler中配置的异常类型来匹配错误映射和处理。

返回JSON格式

在上述例子中,通过@ControllerAdvice统一定义不同Exception映射到不同错误处理页面。而当我们要实现RESTful API时,返回的错误是JSON格式的数据,而不是HTML页面,这时候我们也能轻松支持。

本质上,只需在@ExceptionHandler之后加入@ResponseBody,就能让处理函数return的内容转换为JSON格式。

下面以一个具体示例来实现返回JSON格式的异常处理。

  • 创建统一的JSON返回对象,code:消息类型,message:消息内容,url:请求的url,data:请求返回的数据
public class ErrorInfo<T> {

    public static final Integer OK = 0;
    public static final Integer ERROR = 100;

    private Integer code;
    private String message;
    private String url;
    private T data;

    // 省略getter和setter

}
  • 创建一个自定义异常,用来实验捕获该异常,并返回json
public class MyException extends Exception {

    public MyException(String message) {
        super(message);
    }

}
  • Controller中增加json映射,抛出MyException异常
@Controller
public class HelloController {

    @RequestMapping("/json")
    public String json() throws MyException {
        throw new MyException("发生错误2");
    }

}
  • MyException异常创建对应的处理
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = MyException.class)
    @ResponseBody
    public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception {
        ErrorInfo<String> r = new ErrorInfo<>();
        r.setMessage(e.getMessage());
        r.setCode(ErrorInfo.ERROR);
        r.setData("Some Data");
        r.setUrl(req.getRequestURL().toString());
        return r;
    }

}
{
    code: 100,
    data: "Some Data",
    message: "发生错误2",
    url: "http://localhost:8080/json"
}

至此,已完成在Spring Boot中创建统一的异常处理,实际实现还是依靠Spring MVC的注解,更多更深入的使用可参考Spring MVC的文档。

 

本文完整示例:chapter3-1-6

文章:

http://www.jianshu.com/nb/3978592

示例:

http://git.oschina.net/didispace/SpringBoot-Learning

分享到:
评论

相关推荐

    Spring Cloud Gateway的全局异常处理

    然而,在实际应用过程中,开发者会发现Spring Cloud Gateway默认的异常处理机制并不完善,尤其是对于RESTful API而言,默认情况下返回的是HTML格式的错误页面,这显然不符合前后端分离的应用场景。因此,本文将详细...

    springboot整合thymeleaf+maven实现异常处理页面

    在这个“springboot整合thymeleaf+maven实现异常处理页面”的案例中,我们将探讨如何在 SpringBoot 应用中整合 Thymeleaf 和 Maven,以及如何设置自定义的全局异常处理机制,使得当应用程序出现异常时,能够优雅地将...

    STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)

    在本实战教程中,我们将深入探讨如何使用Spring Tool Suite (STS) 创建一个全面的Spring Boot应用,涵盖了多个关键领域,包括RESTful接口、数据库交互、用户认证、分布式Token的实现(JWT)、Redis缓存操作、日志...

    业务异常提示处理 springboot+Assert(自定义断言)

    在IT行业中,异常处理是系统稳定性和健壮性的重要组成部分,尤其是在使用Spring Boot进行Web开发时。本项目“业务异常提示处理 springboot+Assert(自定义断言)”着重于利用Spring Boot的特性来构建高效、易维护的...

    spring boot简单实践

    Spring Boot还提供了强大的错误处理机制,通过全局异常处理器(`@ControllerAdvice`和`@ExceptionHandler`)可以统一处理各种异常。 在测试方面,Spring Boot提供了`@SpringBootTest`注解进行集成测试,`@...

    spring-boot示例项目

    shiro|[授权、认证、加解密、统一异常处理](https://github.com/smltq/spring-boot-demo/blob/master/shiro/HELP.md) sign|[防篡改、防重放、文档自动生成]...

    生成一个简单的Spring Boot应用程序.pdf

    - **异常处理**:统一异常处理机制,提高应用的健壮性和用户体验。 通过以上内容的学习,开发者可以更好地理解如何使用Spring Boot快速搭建和部署Web应用,同时掌握Spring Boot的一些高级特性,从而提高开发效率和...

    Spring Boot入门与实战_springboot_spring_

    3. **全局异常处理**:通过@ControllerAdvice和@ExceptionHandler注解,可以捕获全局异常并返回统一的响应。 **六、Spring Boot 数据访问** 1. **JPA集成**:Spring Boot 支持JPA,可以轻松地与各种数据库(如MySQL...

    Spring Boot学习入门之统一异常处理详解

    我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。下面这篇文章主要给大家介绍了关于Spring Boot学习入门之统一异常处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

    spring boot管理系统后台

    - Spring Boot提供了统一的异常处理机制,可以自定义错误页面和返回格式。 - 日志框架如Logback或Log4j用于记录系统运行情况,便于调试和监控。 **8. 测试支持** - Spring Boot包含JUnit和Mockito等测试工具的支持...

    spring boot项目demo

    10. **错误处理和日志记录**:Spring Boot提供了统一的异常处理机制和日志框架集成,如Logback或Log4j,方便记录和分析应用运行时的错误和信息。 11. **单元测试和集成测试**:Spring Boot 提供了测试支持,可以...

    基于spring boot实现根据经纬度坐标返回所在行政区域

    在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了构建微服务和Web应用程序的过程。本项目聚焦于一个特定的应用场景:通过经纬度坐标来确定所在行政区域。这一功能在许多领域都有广泛的应用,例如地图...

    Spring Boot-RESTfull API入门.rar

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始设置和开发过程。它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,使得开发者能够快速地创建生产级别...

    专业的Spring Boot

    - **案例二:高性能Web应用开发**:利用Spring Boot搭建高并发Web应用时,可以通过整合Nginx作为反向代理服务器来分发请求,同时采用WebSocket技术实现实时双向通信。 - **案例三:数据持久层优化**:针对数据库操作...

    Spring Boot集成Mybatis附加自动生成工具,异常信息处理等工具类,拦截器,最全框架

    总的来说,这个项目提供了一个完整的Spring Boot和Mybatis集成方案,涵盖了开发过程中的多个重要方面,如自动化工具、异常处理和拦截器,这对于构建高效且可维护的Web应用来说是非常有益的。同时,通过`...

    Spring Boot统一异常处理详解

    Spring Boot作为一款流行的Java开发框架,提供了便捷的方式来实现统一异常处理。本文将深入探讨如何在Spring Boot中进行全局异常处理。 首先,Spring Boot默认提供了一个“error”映射,但其提供的错误页面并不适合...

    spring boot示例代码

    4. **错误处理**:Spring Boot 提供了统一的异常处理机制,通过 `@ExceptionHandler` 注解可以捕获并处理特定的运行时异常。 5. **安全模块**:Spring Security 可以方便地集成到Spring Boot应用中,提供身份验证和...

    spring boot 全面的样例代码

    - chapter3-1-6:[统一异常处理](http://blog.didispace.com/springbootexception/) ### 数据访问 - chapter3-2-1:[使用JdbcTemplate](http://blog.didispace.com/springbootdata1/) - chapter3-2-2:[使用Spring...

    后端异常统一处理解决方案

    这篇博客“后端异常统一处理解决方案”主要探讨了如何在Spring Boot、SSM(Spring、Spring MVC、MyBatis)框架中有效地管理和处理异常,提供了一种优化的方法来提升应用程序的健壮性。 首先,Spring Boot以其简洁的...

Global site tag (gtag.js) - Google Analytics