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

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


image.png

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

{
    "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
}


相关文章
|
1月前
|
JSON 前端开发 Java
解决Spring MVC中No converter found for return value of type异常
在Spring MVC开发中遇到`No converter found for return value of type`异常,通常是因缺少消息转换器、返回值类型不支持或转换器优先级配置错误。解决方案包括:1) 添加对应的消息转换器,如`MappingJackson2HttpMessageConverter`;2) 自定义消息转换器并实现`HttpMessageConverter`接口,设置优先级;3) 修改返回值类型为如`ResponseEntity`的合适类型。通过这些方法可确保返回值正确转换为响应内容。
76 1
|
1月前
|
Java Spring 容器
解决Spring的UnsatisfiedDependencyException异常的方法
在Spring开发中,UnsatisfiedDependencyException异常意味着依赖注入失败,影响应用稳定性。该异常由Spring容器在无法满足bean依赖时抛出,常见原因包括bean定义错误、循环依赖、多个候选bean等。解决方法包括:检查bean定义和注入的正确性、解决循环依赖、确认依赖包的兼容性、使用@Qualifier或@Primary注解。通过日志、调试工具和异常对比来定位问题。持续学习Spring框架有助于更好地解决此类异常。
809 1
|
1月前
|
Java
SpringBoot文件上传和自定义实体工具
SpringBoot文件上传和自定义实体工具
16 0
|
1月前
|
消息中间件 监控 Java
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】
134 0
|
8天前
|
Java
springboot之异常
springboot之异常
11 1
|
16天前
|
前端开发 Java 程序员
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
|
8天前
|
XML Java 数据格式
java异常-SpringBoot-
java异常-SpringBoot-
7 0
|
15天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的小说实体书商城的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的小说实体书商城的详细设计和实现
11 0
|
1月前
|
Java
springboot全局自定义异常
springboot全局自定义异常
|
1月前
|
JSON 前端开发 Java
统一异常处理:让Spring Boot项目异常更优雅
统一异常处理:让Spring Boot项目异常更优雅
36 1