Java

SpringBoot自定义错误页面

勤劳的小蜜蜂 · 12月10日 · 2019年 ·

首先我们需要知道从手机端和浏览器访问项目发生错误时,SpringBoot 的默认错误页面是不一样的。

手机端发生错误返回的是 json 信息

浏览器发生错误返回的是错误页面

SpringBoot 实际上是根据请求头来判断你是浏览器还是 app

自定义错误页面

自定义错误页面很简单

只需要在 resources 目录下,新建 resources/error 目录,然后放入错误页面就行了

ok,再次访问相应的错误页面就是我们自定义的

当然 app 访问返回的 json 还是老样子,因为还没配置,下面就开始自定义返回的 json 信息

自定义错误信息

首先我们自定义一个异常 UserNotExistException 继承自 RuntimeException,返回出错的 id 和 “user is not exist” 错误信息。

@Data
public class UserNotExistException extends RuntimeException {
    private Integer id;

    public UserNotExistException(Integer id) {
        super("user is not exist");
        this.id = id;
    }
}

然后创建 controller 来抛出自定义的异常,并且传入出错的 id 为 1

@RestController
public class ErrorController {

    @GetMapping("/get")
    public void get() {
        throw new UserNotExistException(1);
    }
}

运行,访问 /get,发现 message 是可以传过来了,但是 id 并没有传过来,

因为 SpringBoot 并没有帮我们实现将自定义异常类的字段自动添加到返回值中,所以我们需要自己写代码将它添加进去。

由此,可以想到最常用的统一异常处理方法

@ControllerAdvice 和 @ExceptionHandler

@ControllerAdvice
public class ControllerExceptionHandler {

    @ExceptionHandler(UserNotExistException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Map<String, Object> handlerUserNotExistException(UserNotExistException ex) {
        Map<String, Object> result = new HashMap<>();
        result.put("id", ex.getId());
        result.put("message", ex.getMessage());
        return result;
    }
}

@ControllerAdvice:是 Controller 增强器,可以对 controller 中被 @RequestMapping 注解修饰的方法添加一些逻辑操作。

@ExceptionHandler:异常由被修饰的方法处理

@ResponseStatus:是返回的 HTTP 状态码,是一系列的枚举

ok,至此自定义异常处理就都完成啦。

源码下载

评论后可见此区域内容
0 条回应