springboot之统一异常封装

一:统一返回实体对象

@JsonInclude(Include.NON_NULL)
public class ResponseObject implements Serializable {

    private static final long serialVersionUID = 1L;
    private Integer code = 0;
    private String message = "success";
    private Long time = System.currentTimeMillis();
    private String version = "1.0.0";
    private Object body = new HashMap<String, Object>();
    private String requestParams;
    private String exceptionInfo;

    /**
     * code默认为成功
     */
    public ResponseObject() {
        //默认为成功
    	this.code = ResponseCode.SUCC.getCode();
    }

    public ResponseObject(Integer code, String message) {
    	this.code = code;
        this.message = message;
    }

    public ResponseObject(Integer code, Object body) {
    	this.code = code;
        this.body = body;
    }

    public ResponseObject(ResponseCode errorCode) {
        this.code = errorCode.getCode();
        this.message = errorCode.getMessage();
    }

    public ResponseObject(ResponseCode errorCode, Map<String, Object> body) {
        this.code = errorCode.getCode();
        this.message = errorCode.getMessage();
        this.body = body;

    }

    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public void setSucc() {
        this.code = ResponseCode.SUCC.getCode();
    }

    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    public Long getTime() {
        return time;
    }

    public void setTime(Long time) {
        this.time = time;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
	public String getRequestParams() {
		return requestParams;
	}
	public void setRequestParams(String requestParams) {
		this.requestParams = requestParams;
	}
	public String getExceptionInfo() {
		return exceptionInfo;
	}
	public void setExceptionInfo(String exceptionInfo) {
		this.exceptionInfo = exceptionInfo;
	}

    @SuppressWarnings("unchecked")
	public <T>T getBody() {
        return (T) body;
    }

    public void setBody(Object body) {
        this.body = body;
    }
    /**
     * 通用转换body对象的类型
     * @param clazz
     * @return
     */
    @SuppressWarnings("unchecked")
	public <T>T convertBody(Class<?> clazz) {
    	String result = JsonUtil.toString(this.body);
    	if (this.body instanceof List) {
            this.body = JsonUtil.toList(result, clazz);
    	} else {
    		this.body = JsonUtil.toObject(result, clazz);
    	}
        return (T) this.body;
    }
}

全局异常处理类

/**
 * @Author:liming
 * @Package:com.ms.biz.x.exception
 * @name:GlobalExceptionHandler
 * @Date:2023/11/7 15:54
 * @Filename:GlobalExceptionHandler
 */

@RestControllerAdvice
public class GlobalExceptionHandler{
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    public GlobalExceptionHandler() {}
     //文件大小捕获异常:MaxUploadSizeExceededException
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseObject handlerMaxUploadFile(MaxUploadSizeExceededException ex) {
        ResponseObject = new ResponseObject();
        log.error("异常信息 {} ", ex.getMessage());
        frame.setCode(-1);
        frame.setMessage("单文件超过文件大小限制XM了!");
        frame.setBody("单文件超过文件大小限制XM了!");
        frame.setExceptionInfo("单文件超过文件大小限制XM了!");
        return frame;
    }
     /**
     * spring统一捕获sql异常
     */
    @ExceptionHandler(DataIntegrityViolationException.class)
    @ResponseBody
    public ResponseObject dataIntegrityViolationException(DataIntegrityViolationException e) {
        ResponseObject frame = new ResponseFrame();
        // 异常信息类
        Throwable cause = e.getCause();
        // 字段超长
        if (cause.getClass().equals(SQLIntegrityConstraintViolationException.class)) {
            frame.setMessage("数据库操作异常 数据已存在!");
            String localizedMessage = cause.getLocalizedMessage();
            frame.setBody(localizedMessage);
            // 数据库插入异常
        } else if (cause.getClass().equals(SQLSyntaxErrorException.class)) {
            frame.setMessage("数据库插入异常");
        }
        frame.setCode(-1);
        log.warn("数据库操作异常");
        return frame;
    }
/**
参数非法异常处理 如400
*/
    @ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public ResponseObjecthandleMethodArgumentNotValidException(Exception exception) {
        StringBuilder errorInfo = new StringBuilder();
        BindingResult bindingResult = null;
        if (exception instanceof MethodArgumentNotValidException) {
            bindingResult = ((MethodArgumentNotValidException) exception).getBindingResult();
        }
        if (exception instanceof BindException) {
            bindingResult = ((BindException) exception).getBindingResult();
        }
        for (int i = 0; i < bindingResult.getFieldErrors().size(); i++) {
            if (i > 0) {
                errorInfo.append(",");
            }
            FieldError fieldError = bindingResult.getFieldErrors().get(i);
            errorInfo.append(fieldError.getField()).append(" :").append(fieldError.getDefaultMessage());
        }
        log.error(errorInfo.toString());
        //这里返回自己的Result的结果类。
        ResponseObject = new ResponseObject();
        frame.setBody(errorInfo.toString());
        frame.setCode(-1);
//        frame.setMessage("fail");
        String[] split = errorInfo.toString().split(" :");
        String error = split[1];
        frame.setMessage(error);
        return frame;
    }
}
// 捕获其他未处理的异常,并返回错误信息
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResponseObject handleUncaughtException(Exception ex) {

        return createErrorResponse(-1, "系统内部错误: ", ex.getMessage());
    }

    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResponseObject handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException ex) {

        return createErrorResponse(-1, "请求参数有误: ", ex.getMessage());
    }

    private ResponseObject createErrorResponse(int code, String message, String detils) {
        ResponseObject  frame = new ResponseFrame();
        frame.setMessage(message);
        frame.setCode(code);
        frame.setBody(detils);
        return frame;
    }

全局控制参数配置

server:
  port: 9010
  tomcat:
    max-swallow-size: -1  # tomcat默认大小2M,超过2M的文件不会被捕获,需要调整此处大小为10MB或者-1即可
management:
  endpoints:
    web:
      exposure:
        include=refresh: refresh

spring:
  application:
    name: xxx
  datasource:
    dynamic:
      primary: X #默认主数据库
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        x:
          url: jdbc:oracle:thin:@1.196.2.73:1528:cjhx
          username: 21212
          password: 1212
          driver-class-name: oracle.jdbc.OracleDriver
        y:
          url: jdbc:oracle:thin:@1.190.X.X:1528:cjhx
          username: 12
          password: 1212
          driver-class-name: oracle.jdbc.OracleDriver
  servlet:
    multipart:
      max-file-size: XMB     # 文件上传大小限制为XMB
      max-request-size: XMB  # 请求大小限制为XMB

ps:代码中JsonUtil可以访问链接进去索取
以上的是SpringBoot之远程调用的三大方式 若需完整代码 可识别二维码后 给您发代码。
索取json封装转化工具类
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/612064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新版文件同步工具(Python编写,其中同时加入了多进程计算MD5、多线程复制大文件、多协程复制小文件、彩色输出消息、日志功能)

两个月前&#xff0c;接到一个粉丝的要求&#xff0c;说希望在我之前编写的一个python编写的文件同步脚本(Python编写的简易文件同步工具(已解决大文件同步时内存溢出问题)https://blog.csdn.net/donglxd/article/details/131225175)上加入多线程复制文件的功能&#xff0c;前段…

flutter中固定底部按钮,防止键盘弹出时按钮跟随上移

当我们想要将底部按钮固定在底部&#xff0c;我们只需在Widget中的Scaffold里面加一句 resizeToAvoidBottomInset: false, // 设置为false&#xff0c;固定页面不会因为键盘弹出而移动 效果图如下

CSCWD 2024会议最后一天 女高音惊艳全场,相声笑破肚皮

会议之眼 快讯 今天是第27届国际计算机协同计算与设计大会&#xff08;CSCWD 2024&#xff09;举办的最后一天&#xff01;会议依然热络&#xff0c;紧张而充实&#xff01;各个技术分论坛持续展开&#xff0c;学者们的热情不减&#xff0c;对技术领域的热爱和探索精神令人赞叹…

国产开源物联网操作系统

软件介绍 RT-Thread是一个开源、中立、社区化发展的物联网操作系统&#xff0c;采用C语言编写&#xff0c;具有易移植的特性。该项目提供完整版和Nano版以满足不同设备的资源需求。 功能特点 1.内核层 RT-Thread内核包括多线程调度、信号量、邮箱、消息队列、内存管理、定时器…

VS配置三方依赖

1.配置include 1.1.打开属性 1.2.打开“配置属性”-"C/C"-"常规" 2.配置lib 2.1.配置lib目录 打开"配置属性"-“链接器”-“常规”。 2.2.配置具体的lib 打开"配置属性"-"链接器"-“输入”。 也可以通过代码方式加入&…

差速机器人模型LQR 控制仿真(c++ opencv显示)

1 差速机器人状态方程构建 1.1差速机器人运动学模型 1.2模型线性化 1.3模型离散化 2离散LQR迭代计算 注意1&#xff1a;P值的初值为Q。见链接中的&#xff1a; 注意2&#xff1a;Q, R参数调节 注意3&#xff1a;LQR一般只做横向控制&#xff0c;不做纵向控制。LQR输出的速度…

明火检测实时识别报警:视觉算法助力安全生产管理

背景与现状 在各种工作、生产环境下&#xff0c;明火的存在往往是潜在的安全隐患。无论是加油站、化工园区、仓储场所还是校园&#xff0c;明火一旦失控就会引发火灾&#xff0c;造成严重的人员伤亡和财产损失。传统的明火检查手段主要依赖于人工巡查和定期的消防检查&#xf…

拯救被勒索病毒加密的文件

无意间打开了勒索病毒的告知文件&#xff0c;几年前很多人很熟悉这个文件。 --- Welcome. Again. --- [] Whats Happen? [] Your files are encrypted, and currently unavailable. You can check it: all files on your computer has extension u347q678t1. By the way, e…

安装nvm切换多个nodejs

今天实习&#xff0c;用到了公司的老项目vue2的&#xff0c;需要更换nodejs版本 我想直接安装一个16版本的&#xff0c;然后自己在webstrom中配置一下exe文件就可以了。 然而第一步就不行&#xff0c;在安装另一版本中显示 然后博主在这里介绍一下怎么使用nvm可以快速切换node…

动手学深度学习——多层感知机

1. 感知机 感知机本质上是一个二分类问题。给定输入x、权重w、偏置b&#xff0c;感知机输出&#xff1a; 以猫和狗的分类问题为例&#xff0c;它本质上就是找到下面这条黑色的分割线&#xff0c;使得所有的猫和狗都能被正确的分类。 与线性回归和softmax的不同点&#xff1…

Chronos:学习时间序列的大语言模型(代码解析)

前言 《Chronos: Learning the Language of Time Series》原文地址&#xff0c;Github开源代码地址Chronos&#xff1a;学习时间序列的大语言模型&#xff08;论文解读&#xff09;CSDN地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习…

【漫画版】指挥官的排序战术:快速排序算法解密

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

使用Python在PowerPoint演示文稿之间复制样式(复制幻灯片母版)

在专业演示文稿设计与制作领域&#xff0c;多场演示间保持一致性至关重要。在PowerPoint演示文稿之间复制幻灯片母版成为了一项关键技巧&#xff0c;用以维持统一的视觉风格&#xff0c;确保品牌形象的一致性&#xff0c;并提升观众的参与度。这一做法不仅能节省宝贵的时间&…

OC foudation框架(下)的学习

OCfoudation框架&#xff08;下&#xff09; 前面学习了有关OCfoudation框架的部分内容&#xff0c;我们现在对于后面的内容继续学习。 文章目录 OCfoudation框架&#xff08;下&#xff09;数组&#xff08;NSArray和NSMutableArray&#xff09;对集合元素整体调用方法排序使用…

SwinIR: Image Restoration Using Swin Transformer

ICCV2021 workshophttps://github.com/JingyunLiang/SwinIR 问题引入 将swim transformer使用到图像恢复任务当中&#xff0c;因为卷积存在不能建模长距离依赖以及使用相同的卷积核来恢复不同的图像区域&#xff1b;并不是首个将transformer引入图像恢复中的方法&#xff0c;…

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

Java多线程与并发编程

1.多线程基础 1.1 线程相关概念 程序(program)&#xff1a;是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码 进程: 1. 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程…

常见扩频系统的基础概念和模型

扩频系统是一种通信技术&#xff0c;它通过将信号的频谱扩展到一定程度来实现传输&#xff0c;这种系统的设计和实现涉及到多种不同的方法和技术。 扩频系统的主要特点和好处包括&#xff1a; 抗干扰能力强&#xff1a;由于信号被扩展到较宽的频带上&#xff0c;单位带宽内的功…

数据收集-分化轨迹推断

数据收集-分化轨迹推断 1参考内容 2参考内容 3参考内容 4参考内容 5参考内容 6&#xff1a;methods and datasets review参考内容 1 参考 Ranek, J.S., Stanley, N. & Purvis, J.E. Integrating temporal single-cell gene expression modalities for trajectory inferen…

【p7】正规式转正规文法

需要注意的是&#xff0c;有时候需要自己构造一个非终结符&#xff0c;非终结符推导到空&#xff0c;然后套用上面的公式即可