SpringBoot 统一异常处理\统一响应报文\自定义异常

简介: SpringBoot 统一异常处理\统一响应报文\自定义异常

SpringBoot 统一异常处理

使用注解 @ControllerAdvice

自定义异常

package com.manlitech.cloudboot.basebootconfig.exception;

import com.manlitech.cloudboot.common.enums.ResultEnums;

public class MyException extends RuntimeException{
private Integer code;

    public MyException(ResultEnums resultEnum) {
        super(resultEnum.getMsg());
        this.code = resultEnum.getCode();
    }

    public MyException(Integer code,String msg) {
        super(msg);
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }

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

}

异常捕获做处理

package com.manlitech.cloudboot.basebootconfig.exception;

@ControllerAdvice
@Component
public class ExceptionHandle {

    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
    
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e) {
        //logger.error("exceptionmsg="+e.getMessage());
        if (e instanceof MyException) {
            MyException myException = (MyException) e;
            return ResultUtil.error(myException.getCode(), myException.getMessage());
        }else {
            //logger.error("【系统异常】"+e.getStackTrace());
            e.printStackTrace();
            String message = getExceptionToString(e);
            // 可能由于运行是sentinel发出的runtimeException
            Result sentinelResult = ExceptionHandle.isSentinelRuntimeException(message);
            if(sentinelResult != null){
                return sentinelResult;
            }
            return ResultUtil.error(ResultEnums.UNKONW_ERROR.getCode(),ResultEnums.UNKONW_ERROR.getMsg(),message);
        }
    }


}

ResultUtil 响应公用的方法

package com.manlitech.cloudboot.common.utils;


import org.joda.time.DateTime;

import java.util.List;

public class ResultUtil {

    public static Result success(Object object) {
        Result result = new Result();
        result.setCode(0);
        result.setMsg("成功");
        result.setData(object);
        result.setSystemTime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
        return result;
    }

    public static Result success(Integer code , String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        result.setSystemTime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
        return result;
    }

    public static Result success(List list,Long total) {
        Result result = new Result();
        result.setCode(0);
        result.setMsg("成功");
        result.setData(list);
        result.setRows(total);
        result.setSystemTime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
        return result;
    }

    public static Result success() {
        return success(null);
    }

    public static Result error(Integer code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        result.setSystemTime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
        return result;
    }
    
    public static Result error(Integer code, String msg ,Object object) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(object);
        result.setSystemTime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
        return result;
    }
}

统一的响应格式

package com.manlitech.cloudboot.common.utils;

public class Result<T> {

    /** 错误码. */
    private Integer code;

    /** 提示信息. */
    private String msg;

    /** 具体的内容. */
    private T data;

    /** 错误码. */
    private Long rows;
    
    /** 当前系统时间 */
    private String systemTime;

    public Long getRows() {
        return rows;
    }

    public void setRows(Long rows) {
        this.rows = rows;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer 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;
    }

    public String getSystemTime() {
        return systemTime;
    }

    public void setSystemTime(String systemTime) {
        this.systemTime = systemTime;
    }


}

统一的字典码

package com.manlitech.cloudboot.common.enums;

public enum ResultEnums {

    /*成功返回*/
    SUCCESS(0, "成功"),
    SUCCESS_LOGOUT(1, "退出成功,期待下次使用本系统"),
    /*特殊异常*/
    UNKONW_ERROR(-1, "呀,服务器开小差了~"),
    //登录相关
    NO_LOGIN(-2,"用户信息不存在。可能未登录"), 
    NO_LOGIN_ERR_LOGIN_Info(-3,"用户名密码错误或信息不存在,请核对"),
    NO_LOGIN_REFRESH_TOKEN_IS_EXPIRE(-4,"refresh_token已经失效"),
    ERROR_TOKEN(-5,"token验证失败"),
    ERROR_PERMISSION(-6,"无访问权限"),
    /* 异常相关 */
    UNKONW_REDIS_TYPE(-7,"redis类型[单机,集群]未知"),
    SQL_INJECTION(-8,"警告:sql存在注入风险"),
    NO_FOUND_QUEUE_NAME_JOB (-9,"未找到相对应的队列名称"),
    ERROR_GATEWAY (-10,"网关异常提示"),
    API_FLOW_EXCEPTION (-11,"服务繁忙,请重试,服务限流") ,
    API_DEGRADE_EXCEPTION(-12,"服务繁忙,请重试,服务降级"),
    API_PARAM_HOT_FLOW_EXCEPTION(-13,"服务繁忙,请重试,热点参数限流"),
    API_SYSTEM_BLOCK_EXCEPTION(-14,"服务繁忙,请重试,系统规则(负载/...不满足要求)"),
    API_AUTHORITY_EXCEPTION(-15,"授权规则不通过");
    private Integer code;

    private String msg;

    ResultEnums(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

微信公众号,需要的话就关注下我~

目录
相关文章
|
5月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
385 0
|
1月前
|
Java Maven 开发者
编写SpringBoot的自定义starter包
通过本文的介绍,我们详细讲解了如何创建一个Spring Boot自定义Starter包,包括自动配置类、配置属性类、`spring.factories`文件的创建和配置。通过自定义Starter,可以有效地复用公共配置和组件,提高开发效率。希望本文能帮助您更好地理解和应用Spring Boot自定义Starter,在实际项目中灵活使用这一强大的功能。
49 17
|
5月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
439 2
|
2月前
|
Java 应用服务中间件 Spring
SpringBoot 响应请求是串行还是并行?
Spring Boot 在默认情况下通过 Servlet 容器的线程池实现并行处理 HTTP 请求。通过适当的线程池配置,可以进一步优化并发性能。此外,Spring Boot 提供了异步处理机制(如使用 `@Async` 注解)和反应式编程模型(Spring WebFlux),使得应用能够处理更高的并发负载。在具体项目中,可以根据需求选择合适的处理模型,以充分利用 Spring Boot 的并发处理能力。
66 21
|
3月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
232 14
|
4月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
105 1
|
4月前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
149 0
|
5月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
102 3
|
5月前
|
Java API Spring
springBoot:注解&封装类&异常类&登录实现类 (八)
本文介绍了Spring Boot项目中的一些关键代码片段,包括使用`@PathVariable`绑定路径参数、创建封装类Result和异常处理类GlobalException、定义常量接口Constants、自定义异常ServiceException以及实现用户登录功能。通过这些代码,展示了如何构建RESTful API,处理请求参数,统一返回结果格式,以及全局异常处理等核心功能。
|
5月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
668 10