SpringBoot中Web应用的统一异常处理

在web应用中,请求处理过程中发生异常是非常常见的情况。springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。为了测试,我们通过IDEA的Spring Initializr来快速创建一个SpringBoot的web项目,创建过程省略。

创建完成之后,启动这个项目,访问一个不存在的URL,页面会显示一下内容

该页面就是Spring Boot提供的默认error映射页面。

1、统一异常处理

虽然,Spring Boot中实现了默认的error映射,但是在实际应用中,我们通常需要去实现我们自己的异常提示。例如,当我们要实现RESTful API时,返回的错误是JSON格式的数据。我们一起来实现一下。

新建CodeMsg类

public class CodeMsg {

    private int code;//错误码
    private String msg;//错误信息

    private CodeMsg(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /** 系统模块 */
    public static CodeMsg SERVER_ERROR = new CodeMsg(500100,"服务端异常");
    public static CodeMsg NULL_POINT_EXCEPTION = new CodeMsg(500200,"空指针异常");

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

新建Result类

Result类是用来统一管理返回数据的类

public class Result<T> {
    private int code;//错误码
    private String msg;//提示信息
    private T data;//返回的数据

    private Result(T data){
        this.code = 200;
        this.msg = "success";
        this.data = data;
    }

    private Result(CodeMsg codeMsg){
        if (codeMsg == null){
            return;
        }
        this.code = codeMsg.getCode();
        this.msg = codeMsg.getMsg();
    }

    private Result(String msg){
        this.code = 200;
        this.msg = msg;
    }

    /**
     * 成功的时候调用,接口返回数据
     */
    public static <T> Result<T> success(T data){
        return new Result<T>(data);
    }

    /**
     * 成功的时候调用,接口返回提示信息
     */
    public static <T> Result<T> success(String msg){
        return new Result<T>(msg);
    }

    /**
     * 失败的时候调用,返回错误信息
     */
    public static <T> Result<T> error(CodeMsg codeMsg){
        return new Result<T>(codeMsg);
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

}

新建ZhuangException类

public class ZhuangException extends RuntimeException{

    private CodeMsg codeMsg;

    public ZhuangException(CodeMsg codeMsg){
        super(codeMsg.toString());
        this.codeMsg = codeMsg;
    }

    public CodeMsg getCodeMsg() {
        return codeMsg;
    }
}

新建GlobalExceptionHandler类

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = ZhuangException.class)
    @ResponseBody
    public Result<Object> exceptionHandler(HttpServletRequest request, ZhuangException ex){
        //ex.printStackTrace();
        if (ex instanceof ZhuangException){
            ZhuangException exception = (ZhuangException) ex;
            return Result.error(exception.getCodeMsg());
        }else {
            return Result.error(CodeMsg.SERVER_ERROR);
        }

    }

}

新建UserController测试

@Controller
public class UserController {

    @RequestMapping("/test")
    @ResponseBody
    public Result<Object> test(){
        try {
            String a = null;
            a.length();

            return Result.success("测试成功");
        }catch (Exception e){
            throw new ZhuangException(CodeMsg.NULL_POINT_EXCEPTION);
        }

    }

}

启动工程,访问http://localhost:8080/test,页面上显示的信息为

{"code":500200,"msg":"空指针异常","data":null}

这样的提示信息简洁明了,让人看着也舒服。

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

参考:http://blog.didispace.com/springbootexception/

猜你喜欢

转载自www.cnblogs.com/beanbag/p/10655960.html