springboot统一处理返回实体与异常抛出

Posted 小黄鸡1992

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot统一处理返回实体与异常抛出相关的知识,希望对你有一定的参考价值。


当返回异常时,是这样子的


    "timestamp": "2019-12-11T05:37:10.096+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "报错了",
    "path": "/test/testException"

但是,可能有时前台需要一个code值来判断抛出的错误,这样就需要我们封装去返回code值和message值。同时还可以拦截异常进行输出,是市面架构的通用做法。下文将介绍如何统一处理返回实体与异常抛出。

1.自定义返回对象

1.定义一个返回实体类,如果不进行处理,直接输出200和成功码。在接口输出最外层都使用该实体,这样前端就能有规范的获取数据与信息值。

public enum CommonEnum 

    SC_SUCCESS(200, "成功"),

    SC_NO_JURISDICTION(401, "没有权限,请联系管理员授权"),

    SC_INTERNAL_SERVER_ERROR_500(500, "接口异常");



public class Result<T> implements Serializable 

    /**
     * 返回编码
     */
    private Integer code = 200;

    /**
     * 返回信息
     */
    private String message = "操作成功";

    /**
     * 返回数据
     */
    private T data;

    /**
     * 成功标志
     */
    private boolean success = true;

    public Result() 
    

    public Result(Integer code, String Message) 
        this.code = code;
        this.message = Message;
    

    public int getCode() 
        return code;
    

    public void setCode(Integer code) 
        this.code = code;
    

    public String getMessage() 
        return this.message;
    

    public void setMessage(String message) 
        this.message = message;
    

    public T getData() 
        return data;
    

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

    public void SetResult(Integer code, String msg, T data) 
        this.setMessage(msg);
        this.setData(data);
        this.setCode(code);
    

    public static Result<Object> error(String msg) 
        return error(CommonEnum.SC_INTERNAL_SERVER_ERROR_500.getCode(), msg);
    

    public static Result<Object> error(int code, String msg) 
        Result<Object> r = new Result<Object>();
        r.setCode(code);
        r.setMessage(msg);
        return r;
    

2.异常的统一处理

  1. 自定义一个TemplateException ,需要继承Exception (或其他子类)。
public class TemplateException extends Exception 

    /**
     * 服务器状态码
     */
    private Integer code;

    /**
     * 错误信息
     */
    private String message;

    public Integer getCode() 
        return code;
    

    public void setCode(Integer code) 
        this.code = code;
    

    @Override
    public String getMessage() 
        return message;
    

    public void setMessage(String message) 
        this.message = message;
    

    public TemplateException(String message) 
        this.message = message;
    

    public TemplateException(Integer code, String message) 
        this.message = message;
        this.code = code;
    

  1. 定义一个ExceptionHandle,在异常时会进行逻辑处理。所以不需要在写try-catch了,直接在该类配置即可。
@RestControllerAdvice
public class DemoExceptionHandler 

    private final static Logger logger = LoggerFactory.getLogger(DemoExceptionHandler.class);

    /**
     * 自定义异常处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(TemplateException.class)
    public Result<?> handleTemplateException(TemplateException e) 
        logger.info(e.getMessage());
        e.printStackTrace();
        return Result.error(e.getCode(), e.getMessage());
    

    /**
     * exception异常处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Result<?> handleException(Exception e) 
        logger.info(e.getMessage());
        e.printStackTrace();
        return Result.error("接口异常,错误信息为" + e.getMessage());
    

    /**
     * 权限异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(UnauthorizedException.class, AuthorizationException.class)
    public Result<?> handleAuthorizationException(AuthorizationException e) 
        logger.info(e.getMessage());
        e.printStackTrace();
        return Result.error(CommonEnum.SC_NO_JURISDICTION.getCode(), CommonEnum.SC_NO_JURISDICTION.getMessage());
    

这时候在抛出异常时,返回值为 。


    "code": 10066,
    "status": 0,
    "msg": "报错了",
    "data": null

以上是关于springboot统一处理返回实体与异常抛出的主要内容,如果未能解决你的问题,请参考以下文章

springboot 实体参数校验 validate 抛出javax.validation.ConstraintViolationException异常 统一处理

springboot统一响应实体封装+统一异常类管理

SpringBoot系列优雅的处理统一异常处理与统一结果返回

SpringBoot2.0统一返回Rest风格数据结构与统一异常处理

springboot 统一异常处理

springboot统一异常处理