首页 > 其他分享 >Springcloud学习笔记58--SpringBoot拦截全局异常统一处理(RestControllerAdvice注解)

Springcloud学习笔记58--SpringBoot拦截全局异常统一处理(RestControllerAdvice注解)

时间:2023-12-07 16:57:18浏览次数:27  
标签:code 58 -- Springcloud Result import data public String

1. 应用场景

如果和前端约定好使用固定的自定义格式返回参数,如下:

{
    "code": 200,
    "msg": "操作成功",
    "data": {
        "equipment": 55,
        "code": 99,
        "point": 2
    }
}

但在运行时发现了异常,默认的异常返回格式如下:

{
    "timestamp": "2019-09-16T08:22:58.463+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "条码已存在!",
    "path": "/machine/molding"
}

我们希望以自定义的格式返回所有数据,那么就需要将异常进行拦截处理并统一返回。

2.自定义返回实体类

package com.ttbank.flep.pojo;
import lombok.*;
import java.io.Serializable;

/**
 * @Author lucky
 * @Date 2023/12/7 10:16
 */
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {

    public static final String SUCCESS_CODE="00000000";
    public static final String SUCCESS_MSG="SUCCESS";

    private String code;
    private String msg;
    private T data;

    public static <T> Result success(){
        return new Result(SUCCESS_CODE,SUCCESS_MSG,null);
    }

    public static <T> Result success(T data){
        return new Result(SUCCESS_CODE,SUCCESS_MSG,data);
    }

    public static <T> Result error(String code,String msg){
        return new Result(code,msg,null);
    }

    public static <T> Result error(String code,String msg,T data){
        return new Result(code,msg,data);
    }
}

3 自定义异常枚举类

package com.ttbank.flep.exception;

/**
 * @Author lucky
 * @Date 2023/12/7 9:45
 */
public enum FlepExpEnum {

    PARAM_CHECK_ERROR("flep1001","参数校验失败"),
    SUBSYS_INFO_ERROR("flep1002","子系统不存在或未启用"),
    SUBSYS_CONTENT_ERROR("flep1002","子系统内容关联不存在或未启用");

    private final String code;
    private final String message;


    FlepExpEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

4 自定义异常信息类

package com.ttbank.flep.exception;

import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author lucky
 * @Date 2022/7/11 17:15
 */
@Data
@NoArgsConstructor
public class FlepException extends RuntimeException {
    private String code;
    private String message;
    private String data;

    public FlepException(FlepExpEnum flepExpEnum){
        this.code=flepExpEnum.getCode();
        this.message=flepExpEnum.getMessage();
    }

    public FlepException(FlepExpEnum flepExpEnum,String data){
        this.code=flepExpEnum.getCode();
        this.message=flepExpEnum.getMessage();
        this.data=data;
    }

    public FlepException(String code,String message,String data){
        this.code=code;
        this.message=message;
        this.data=data;
    }
    
}

5. 定义异常统一处理类

package com.ttbank.flep.exception;

import com.ttbank.flep.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @Author lucky
 * @Date 2023/12/7 10:06
 */
@Slf4j
@RestControllerAdvice
public class FlepExceptionHandler {
    @ExceptionHandler(Exception.class)
    public Result flepExceptionHandler(Exception exception){
        if(exception instanceof FlepException){
            FlepException flepException= (FlepException) exception;
            return Result.error(flepException.getCode(),flepException.getMessage(),flepException.getData());
        }else{
            log.error("发生了系统异常:",exception);
            return Result.error("999","系统异常");
        }
    }
}

6. 测试类

package com.ttbank.flep.controller;

import com.ttbank.flep.aspect.MyAnnotation;
import com.ttbank.flep.exception.FlepExpEnum;
import com.ttbank.flep.pojo.Result;
import com.ttbank.flep.util.HttpUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author lucky
 * @Date 2023/12/7 10:55
 */
@RestController
//@RequestMapping("/test")
public class ExceptionTestController {

    @PostMapping("/getFlepInfo")
    public Result<String> getFlepInfo(@RequestParam String busiType){
        if(busiType.equals("1")){
            return Result.success("111");
        }else if(busiType.equals("2")){
            return Result.error(FlepExpEnum.SUBSYS_INFO_ERROR.getCode(),FlepExpEnum.SUBSYS_INFO_ERROR.getMessage() );
        }else if(busiType.equals("3")){
            return Result.error(FlepExpEnum.SUBSYS_CONTENT_ERROR.getCode(),FlepExpEnum.SUBSYS_CONTENT_ERROR.getMessage() );
        }else {
            throw new RuntimeException();
        }

    }
}

postman测试结果:

参考文献:

https://blog.csdn.net/WZH577/article/details/100921971

 

 

标签:code,58,--,Springcloud,Result,import,data,public,String
From: https://www.cnblogs.com/luckyplj/p/17883382.html

相关文章

  • UML图总结
    UML(统一建模语言)是一种用于软件系统设计和开发的标准化建模语言。它通过图形化的方式描述了软件系统的各种方面,包括结构、行为、功能和交互关系,以便于工程师、设计师和开发人员之间的沟通和理解。UML图可以分为结构图和行为图两大类。结构图主要描述系统的静态结构,包括类图、对象......
  • java使用ftp连接linux处理文件
    1、Maven依赖<!--FTP使用包--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version></dependency>......
  • 如何使用Visual Studio 2022创建基本Vue.js.Web应用程序
    最近接了个物联网项目,需要用到   VUEAnt-Design 对于vue没有概念 只能查找相关  vue.js的知识。 了解vue.js的前提条件 是要对  HTML+CSS+Jscript有一定的知识储备。所以又去看了看对应的三剑客(HTML+CSS+Jscript)。跟着vue.js官网学习了一下,就......
  • 【故障公告】数据库服务器今年第七次 CPU 100% 故障
    自11月9日第六次数据库服务器CPU100%故障之后,今天下午又出现数据库服务器CPU100%故障,是今年的第七次。今天的故障发生于16:01~16:07期间,发现故障后我们立即重启阿里云RDS实例,重启后恢复正常。正准备发布这篇故障公告时,数据库服务器又出现CPU100%,我们立即改用主备切换......
  • 解决安装centos7后无法用ifconfig查IP的问题
    问题点:刚安装完centos7后,通过虚拟机查看ip,用ifconfig指令无法查询,显示notfound 解决办法:安装ifconfig和net-tools 1、执行命令:yumprovidesifconfig   2、执行命令:yuminstallnet-tools  (中间需要手动确认y/n,输入y即可)  最后安装完成:  验证:再次输入......
  • 卡特兰数&斯特林数
    卡特兰数引入不妨从找规律开始。下标从\(0\)开始,卡特兰数的前几项为:1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790…那么通过认真的瞪眼观察,会发现它们满足递推关系。关于卡特兰数是一个很常见的数列。它并没有一个足够......
  • C++(Protocol Buffers)
    ProtocolBuffers(简称Protobuf)是由Google开发的一种轻量级、高效、可扩展的数据序列化协议。它旨在成为一种语言无关、平台无关、可扩展、高效的数据交换格式。Protobuf通常用于在不同的系统或组件之间进行数据通信,如在分布式系统中,或者作为数据存储格式。以下是ProtocolBu......
  • Docker安装Zabbix-server出现[its "users" table is empty]问题的解决
    简述安装过程dockerrun--namezabbix-db--networkzabbixnet-eMYSQL_ROOT_PASSWORD="password"-eMYSQL_USER="zabbix"-eMYSQL_PASSWORD="zabbix"-eMYSQL_DATABASE="zabbix"-dmysqldockerrun--namezabbix-server--net......
  • map里面的参数拼接到url上
    publicstaticStringdoPostOtherBody(Stringurl,Map<String,Object>params,HashMap<String,String>headParams){Stringresponse="";StringBufferstrtTotalURL=newStringBuffer();if(url.indexOf("?")......
  • 高维前缀和
    对于求高维前缀和,我的理解是在维度数乘总点数的复杂度下求前缀和。首先可以先看看二维前缀和。如果使用容斥的方法,像这样:for(inti=1;i<=n;i++){ for(intj=1;j<=m;j++){ f[i][j]=a[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]; }}那么就是\(2^w\timesn\timesm\)。(\(w\)是......