|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- # spring-boot-demo-exception-handler
-
- > 此 demo 演示了如何在Spring Boot中进行统一的异常处理,包括了两种方式的处理:第一种对常见API形式的接口进行异常处理,统一封装返回格式;第二种是对模板页面请求的异常处理,统一处理错误页面。
-
- ## pom.xml
-
- ```xml
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>spring-boot-demo-exception-handler</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <packaging>jar</packaging>
-
- <name>spring-boot-demo-exception-handler</name>
- <description>Demo project for Spring Boot</description>
-
- <parent>
- <groupId>com.xkcoding</groupId>
- <artifactId>spring-boot-demo</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- </parent>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
- </dependencies>
-
- <build>
- <finalName>spring-boot-demo-exception-handler</finalName>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>
- ```
-
- ## ApiResponse.java
-
- > 统一的API格式返回封装,里面涉及到的 `BaseException` 和`Status` 这两个类,具体代码见 demo。
-
- ```java
- /**
- * <p>
- * 通用的 API 接口封装
- * </p>
- *
- * @author yangkai.shen
- * @date Created in 2018-10-02 20:57
- */
- @Data
- public class ApiResponse {
- /**
- * 状态码
- */
- private Integer code;
-
- /**
- * 返回内容
- */
- private String message;
-
- /**
- * 返回数据
- */
- private Object data;
-
- /**
- * 无参构造函数
- */
- private ApiResponse() {
-
- }
-
- /**
- * 全参构造函数
- *
- * @param code 状态码
- * @param message 返回内容
- * @param data 返回数据
- */
- private ApiResponse(Integer code, String message, Object data) {
- this.code = code;
- this.message = message;
- this.data = data;
- }
-
- /**
- * 构造一个自定义的API返回
- *
- * @param code 状态码
- * @param message 返回内容
- * @param data 返回数据
- * @return ApiResponse
- */
- public static ApiResponse of(Integer code, String message, Object data) {
- return new ApiResponse(code, message, data);
- }
-
- /**
- * 构造一个成功且带数据的API返回
- *
- * @param data 返回数据
- * @return ApiResponse
- */
- public static ApiResponse ofSuccess(Object data) {
- return ofStatus(Status.OK, data);
- }
-
- /**
- * 构造一个成功且自定义消息的API返回
- *
- * @param message 返回内容
- * @return ApiResponse
- */
- public static ApiResponse ofMessage(String message) {
- return of(Status.OK.getCode(), message, null);
- }
-
- /**
- * 构造一个有状态的API返回
- *
- * @param status 状态 {@link Status}
- * @return ApiResponse
- */
- public static ApiResponse ofStatus(Status status) {
- return ofStatus(status, null);
- }
-
- /**
- * 构造一个有状态且带数据的API返回
- *
- * @param status 状态 {@link Status}
- * @param data 返回数据
- * @return ApiResponse
- */
- public static ApiResponse ofStatus(Status status, Object data) {
- return of(status.getCode(), status.getMessage(), data);
- }
-
- /**
- * 构造一个异常且带数据的API返回
- *
- * @param t 异常
- * @param data 返回数据
- * @param <T> {@link BaseException} 的子类
- * @return ApiResponse
- */
- public static <T extends BaseException> ApiResponse ofException(T t, Object data) {
- return of(t.getCode(), t.getMessage(), data);
- }
-
- /**
- * 构造一个异常且带数据的API返回
- *
- * @param t 异常
- * @param <T> {@link BaseException} 的子类
- * @return ApiResponse
- */
- public static <T extends BaseException> ApiResponse ofException(T t) {
- return ofException(t, null);
- }
- }
- ```
-
- ## DemoExceptionHandler.java
-
- ```java
- /**
- * <p>
- * 统一异常处理
- * </p>
- *
- * @author yangkai.shen
- * @date Created in 2018-10-02 21:26
- */
- @ControllerAdvice
- @Slf4j
- public class DemoExceptionHandler {
- private static final String DEFAULT_ERROR_VIEW = "error";
-
- /**
- * 统一 json 异常处理
- *
- * @param exception JsonException
- * @return 统一返回 json 格式
- */
- @ExceptionHandler(value = JsonException.class)
- @ResponseBody
- public ApiResponse jsonErrorHandler(JsonException exception) {
- log.error("【JsonException】:{}", exception.getMessage());
- return ApiResponse.ofException(exception);
- }
-
- /**
- * 统一 页面 异常处理
- *
- * @param exception PageException
- * @return 统一跳转到异常页面
- */
- @ExceptionHandler(value = PageException.class)
- public ModelAndView pageErrorHandler(PageException exception) {
- log.error("【DemoPageException】:{}", exception.getMessage());
- ModelAndView view = new ModelAndView();
- view.addObject("message", exception.getMessage());
- view.setViewName(DEFAULT_ERROR_VIEW);
- return view;
- }
- }
- ```
-
- ## error.html
-
- > 位于 `src/main/resources/template` 目录下
-
- ```html
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
- <head lang="en">
- <meta charset="UTF-8"/>
- <title>统一页面异常处理</title>
- </head>
- <body>
- <h1>统一页面异常处理</h1>
- <div th:text="${message}"></div>
- </body>
- </html>
- ```
-
|