# spring-boot-demo-exceptionhandler
依赖[spring-boot-demo-parent](../spring-boot-demo-parent)、`spring-boot-starter-thymeleaf`(关于 thymeleaf 的会在后面的模板引擎专门有demo)
### pom.xml
```xml
4.0.0
spring-boot-demo-exceptionhandler
0.0.1-SNAPSHOT
jar
spring-boot-demo-exceptionhandler
Demo project for Spring Boot
com.xkcoding
spring-boot-demo-parent
0.0.1-SNAPSHOT
../spring-boot-demo-parent/pom.xml
org.springframework.boot
spring-boot-starter-thymeleaf
spring-boot-demo-exceptionhandler
```
### application.yml
```yaml
server:
port: 8080
context-path: /demo
spring:
thymeleaf:
mode: HTML5
encoding: UTF-8
content-type: text/html
cache: false
```
### DemoExceptionHandler.java
```java
/**
* 自定义异常统一处理
*
* @package: com.xkcoding.springbootdemoexceptionhandler.handler
* @description: 自定义异常统一处理
* @author: yangkai.shen
* @date: Created in 2017/11/24 下午1:37
* @copyright: Copyright (c) 2017
* @version: 0.0.1
* @modified: yangkai.shen
*/
@ControllerAdvice
@Slf4j
public class DemoExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error";
/**
* 统一 json 异常处理
*
* @param exception DemoJsonException
* @return 统一返回 json 格式
*/
@ExceptionHandler(value = DemoJsonException.class)
@ResponseBody
public R jsonErrorHandler(DemoJsonException exception) {
log.error("【DemoJsonException】:{}", exception.getMessage());
return R.error(exception);
}
/**
* 统一 页面 异常处理
*
* @param exception DemoPageException
* @return 统一跳转到异常页面
*/
@ExceptionHandler(value = DemoPageException.class)
public ModelAndView pageErrorHandler(DemoPageException exception) {
log.error("【DemoPageException】:{}", exception.getMessage());
ModelAndView view = new ModelAndView();
view.addObject("message", exception.getMessage());
view.setViewName(DEFAULT_ERROR_VIEW);
return view;
}
}
```
### R.java
```java
/**
* 统一返回的 json 对象
*
* @package: com.xkcoding.springbootdemoexceptionhandler
* @description: 统一返回的 json 对象
* @author: yangkai.shen
* @date: Created in 2017/11/24 下午1:42
* @copyright: Copyright (c) 2017
* @version: 0.0.1
* @modified: yangkai.shen
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class R {
private Integer code;
private String message;
private T data;
public R(Status status) {
this.code = status.getCode();
this.message = status.getMessage();
}
public static R success(Integer code, String message, Object data) {
return new R(code, message, data);
}
public static R success() {
return new R(Status.OK);
}
public static R success(String message) {
return success(message, null);
}
public static R success(String message, Object data) {
return success(Code.SUCCESS.getCode(), message, data);
}
public static R error(Integer code, String message, Object data) {
return new R(code, message, data);
}
public static R error(Integer code, String message) {
return error(code, message, null);
}
public static R error(DemoJsonException exception) {
return error(exception.getCode(), exception.getMessage());
}
}
```
### error.html (在目录 `resources/templates` 下)
```html
统一页面异常处理
统一页面异常处理
```
### 其余代码
详情请参见本demo。