forked from xkcoding/spring-boot-demo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
✨ spring-boot-demo-exception-handler 完成
- Loading branch information
Showing
14 changed files
with
783 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/target/ | ||
!.mvn/wrapper/maven-wrapper.jar | ||
|
||
### STS ### | ||
.apt_generated | ||
.classpath | ||
.factorypath | ||
.project | ||
.settings | ||
.springBeans | ||
.sts4-cache | ||
|
||
### IntelliJ IDEA ### | ||
.idea | ||
*.iws | ||
*.iml | ||
*.ipr | ||
|
||
### NetBeans ### | ||
/nbproject/private/ | ||
/build/ | ||
/nbbuild/ | ||
/dist/ | ||
/nbdist/ | ||
/.nb-gradle/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,271 @@ | ||
# 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> | ||
|
||
<groupId>com.xkcoding</groupId> | ||
<artifactId>spring-boot-demo-exception-handler</artifactId> | ||
<version>0.0.1-SNAPSHOT</version> | ||
<packaging>jar</packaging> | ||
|
||
<name>spring-boot-demo-exception-handler</name> | ||
<description>Demo project for Spring Boot</description> | ||
|
||
<parent> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-parent</artifactId> | ||
<version>2.0.5.RELEASE</version> | ||
<relativePath/> <!-- lookup parent from repository --> | ||
</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> | ||
</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> | ||
* | ||
* @package: com.xkcoding.exception.handler.model | ||
* @description: 通用的 API 接口封装 | ||
* @author: yangkai.shen | ||
* @date: Created in 2018/10/2 8:57 PM | ||
* @copyright: Copyright (c) 2018 | ||
* @version: V1.0 | ||
* @modified: yangkai.shen | ||
*/ | ||
@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> | ||
* | ||
* @package: com.xkcoding.exception.handler.handler | ||
* @description: 统一异常处理 | ||
* @author: yangkai.shen | ||
* @date: Created in 2018/10/2 9:26 PM | ||
* @copyright: Copyright (c) 2018 | ||
* @version: V1.0 | ||
* @modified: yangkai.shen | ||
*/ | ||
@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> | ||
``` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
<?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> | ||
|
||
<groupId>com.xkcoding</groupId> | ||
<artifactId>spring-boot-demo-exception-handler</artifactId> | ||
<version>0.0.1-SNAPSHOT</version> | ||
<packaging>jar</packaging> | ||
|
||
<name>spring-boot-demo-exception-handler</name> | ||
<description>Demo project for Spring Boot</description> | ||
|
||
<parent> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-parent</artifactId> | ||
<version>2.0.5.RELEASE</version> | ||
<relativePath/> <!-- lookup parent from repository --> | ||
</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> | ||
</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> |
25 changes: 25 additions & 0 deletions
25
...c/main/java/com/xkcoding/exception/handler/SpringBootDemoExceptionHandlerApplication.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.xkcoding.exception.handler; | ||
|
||
import org.springframework.boot.SpringApplication; | ||
import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
|
||
/** | ||
* <p> | ||
* 启动类 | ||
* </p> | ||
* | ||
* @package: com.xkcoding.exception.handler | ||
* @description: 启动类 | ||
* @author: yangkai.shen | ||
* @date: Created in 2018/10/2 8:49 PM | ||
* @copyright: Copyright (c) 2018 | ||
* @version: V1.0 | ||
* @modified: yangkai.shen | ||
*/ | ||
@SpringBootApplication | ||
public class SpringBootDemoExceptionHandlerApplication { | ||
|
||
public static void main(String[] args) { | ||
SpringApplication.run(SpringBootDemoExceptionHandlerApplication.class, args); | ||
} | ||
} |
Oops, something went wrong.