Springboot项目统一异常处理

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一.接口返回值封装

基于目前大多数项目都采用前后端分离架构,所以后端接口统一返回值封装是比较重要的,便于前后端对接与统一处理。当然按各自项目约定实现即可,思路大同小异,下面是我的实现方式,仅供参考

1. 定义Result对象,作为通用返回结果封装

/**
 * <p>@filename Result</p>
 * <p>
 * <p>@description 通用返回结果封装</p>
 *
 * @author llspace
 * @version 1.0
 * @since 2019/6/17 11:55
 **/
@Data
public class Result<T> {
    private int code;
    private String msg;
    private T data;
    /**
     * 成功时候的调用
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>(data);
    }
    /**
     * 失败时候的调用
     */
    public static <T> Result<T> error(CodeMsg cm) {
        return new Result<T>(cm);
    }
    private Result(T data) {
        this.code = 0;
        this.msg = "success";
        this.data = data;
    }
    private Result(CodeMsg cm) {
        if (cm == null) {
            return;
        }
        this.code = cm.getCode();
        this.msg = cm.getMsg();
    }
}

2. 定义CodeMsg对象,作为通用状态码和消息封装

/**
 * <p>@filename CodeMsg</p>
 * <p>
 * <p>@description 通用状态码和消息封装</p>
 *
 * @author llspace
 * @version 1.0
 * @since 2019/6/17 11:57
 **/
@Data
public class CodeMsg {
    //自定义状态码
    private int code;
    //消息信息
    private String msg;
    //通用异常 4001XX
    public static CodeMsg SUCCESS = new CodeMsg(0, "success");
    public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常");
    //模块1 4002XX
    //模块2 4003XX
    //模块3 4004XX
    private CodeMsg(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public CodeMsg fillArgs(Object... args) {
        int code = this.code;
        String message = String.format(this.msg, args);
        return new CodeMsg(code, message);
    }
}

二.定义全局异常类

基于上面封装的CodeMsg实现GlobalException定义,异常继承RuntimeException

 /**
 * <p>@filename GlobalException</p>
 * <p>
 * <p>@description 全局异常信息</p>
 *
 * @author llspace
 * @version 1.0
 * @since 2019/6/20 18:05
 **/
@Data
public class GlobalException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    private CodeMsg codeMsg;
    public GlobalException(CodeMsg codeMsg) {
        super(codeMsg.toString());
        this.codeMsg = codeMsg;
    }
}

三.定义异常处理类

@RestControllerAdvice作用等同于@ResponseBody加上@ControllerAdvice,会在所有带有@Controller或者@RestController注解的类上生效,还可以使用basePackages参数配置指定异常处理类生效的包

/**
 * <p>@filename GlobalExceptionHandler</p>
 * <p>
 * <p>@description 全局异常处理类</p>
 *
 * @author llspace
 * @version 1.0
 * @since 2019/6/20 18:07
 **/
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public Result<String> exceptionHandler(HttpServletRequest request, Exception e){
        e.printStackTrace();
        if(e instanceof GlobalException) {
            GlobalException exception = (GlobalException) e;
            return Result.error(exception.getCodeMsg());
        }else if(e instanceof BindException) {
            BindException ex = (BindException) e;
            List<ObjectError> errors = ex.getAllErrors();
            ObjectError error = errors.get(0);
            String msg = error.getDefaultMessage();
            return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
        }else {
            return Result.error(CodeMsg.SERVER_ERROR);
        }
    }
}

四.特殊处理404异常

spring boot默认不会抛出404异常(NoHandlerFoundException),所以在ControllerAdvice中捕获不到该异常,导致404总是跳过ContollerAdvice,直接显示ErrorController的错误页。需要改变配置,让404错误抛出异常(NoHandlerFoundException),这样便可在ControllerAdvice中捕获此异常。

如果是restful项目改变配置即可实现捕获上述异常,在application.yml中添加:

spring:
  mvc:
    throw-exception-if-no-handler-found: true
  resources: 
    add-mappings: false

注意:添加了如上配置会造成项目静态资源访问异常, 如果不是restful的项目这样配置就会有问题,所以就需要采用其他方式来处理了, 可以参考如下处理方法

如果是带静态资源的项目我们要如何来处理404异常呢?

断点下BasicErrorController类,查看下源码可知,errorHtml()方法默认会返回一个new ModelAndView(“error”, model),所以其实在classpath:/templates下自定义一个error.html即可,这样springboot默认的404错误就跳转到了自己项目下的error页面了,这种处理比较简单,如果想更好的封装错误页面,建议自己实现ErrorController接口,或者继承AbstractErrorController / BasicErrorController类来实现,当然前提是删除掉配置文件中上述的两个配置

五.测试使用效果

至此,统一异常处理就实现了,如下使用,

if(loginVO == null) {
    throw new GlobalException(CodeMsg.SERVER_ERROR);
}

这样会抛出异常如下:

GlobalException(codeMsg=CodeMsg(code=500100, msg=服务端异常))

如果是404异常会跳项目自定义的error页面
在这里插入图片描述

个人实现,仅供参考,有兴趣的小伙伴自己动手尝试吧!

springboot项目实战-统一异常处理 项目开发过程中会碰到很多异常,一些异常是因为用户的操作产生的,另外一些可能是系统的原因(如网络、操作系统和服务器等)。统一处理所有的异常能够减少代码的重复度和复杂度,有利于代码的维护,不对外暴露原始错误,给用户友好的错误提示。对异常的处理一般分为两种:抛出异常或使用try…catch…finally捕获处理异常。 阅读详情

相关推荐

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 510

SpringBoot统一异常处理详解

Spring Boot后端接口规范Spring在3.2版本增加了一个注解,可以与、、等注解注解配套使用。不过跟异常处理相关的只有注解,从字面上看,就是异常处理器的意思**Assert(断言)**是Spring 家族的,在我们写测试用例的时候经常会用到,使用断言能让我们编码的时候有一种非一般丝滑的感觉Assert的部分源码,可以看到,Assert 其实就是帮我们把 if {…} 封装了一下,抛出的异常是} } }

Shawn的个人博客 1万+

NVIDIA DGX Spark实战指南:从开箱到部署200B参数大模型

本文详细介绍了NVIDIA DGX Spark桌面AI超级计算机的开箱体验与实战部署指南。文章深入解析了其Grace Blackwell架构与128GB统一内存的核心优势,并逐步演示了从系统初始化、运行200B参数大模型到进行QLoRA微调的全过程。该设备将高达1 PetaFLOP的AI算力浓缩于桌面,为开发者和研究团队提供了本地化、高性能的AI开发与部署一体化解决方案。

weixin_29274969的博客 2075

springboot整合之统一异常处理

springboot整合实战 springboot整合之统一异常处理

qq_35771266的博客 6144

SpringBoot 如何进行 统一异常处理

首先,你需要根据自己的需求创建自定义的异常类。可以继承现有的异常类,比如RuntimeException,或者创建自己的异常类。自定义异常类应该包含错误码和错误消息等必要的信息。// 构造方法// getter和setter方法。

· 3594

SpringBoot实现统一异常处理(图文详解)

近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。本项目为前后端分离开发,后端基于Java21和开发,后端使用JWT等技术栈,前端提供了vueangularreactuniapp微信小程序等多种脚手架工程。在前后端分离的项目开发过程中,我们通常会对数据返回格式进行统一的处理,这样可以方便前端人员取数据,后端发生异常时同样会使用此格式将异常信息返回给前端。

2301_79644036的博客 2185

(自用)springboot统一异常处理

ErrorResponse error = new ErrorResponse(500, "服务器内部错误", System.currentTimeMillis());- **文件上传异常**:`MaxUploadSizeExceededException`- **数据库异常**:`DataIntegrityViolationException`// HTTP状态码(如400)- **权限异常**:`AccessDeniedException`- **集中管理异常**:避免散落在各Controller中。

weixin_55869972的博客 890

Spring Boot 项目统一异常处理

介绍如何Spring Boot项目中进行统一异常处理

关关的博客 705

SpringBoot项目统一异常处理统一日志处理

SpringBoot项目统一异常处理统一日志处理 统一异常处理 本文章介绍三种异常处理:全局异常处理、特定异常处理、自定义异常处理 1、全局异常处理 如果是父子工程,在common子工程中,创建一个子模块common-utils,在子模块下创建一个handler包,在包中创建一个ExceptionHandler(此创建可以根据个人习惯创建,因为整个项目统一异常处理,最好放在公共模块中);如果是单个工程项目,就在主包下创建一个handler包,然后创建一个ExceptionHandler类 (1)创建Exc

weixin_51370812的博客 936

springboot 404_Springboot项目统一异常处理

Springboot项目统一异常处理一.接口返回值封装基于目前大多数项目都采用前后端分离架构,所以后端接口统一返回值封装是比较重要的,便于前后端对接与统一处理。当然按各自项目约定实现即可,思路大同小异,下面是我的实现方式,仅供参考1. 定义Result对象,作为通用返回结果封装/** * @filename Result * * @description 通用返回结果封装 * * @author...

weixin_39604350的博客 419

SpringBoot项目接口统一响应处理、统一异常处理统一配置、接口验证

ResponseBodyAdvice 接口实现自定义返回数据类型 api接口中都是需要定义一个统一的响应头来返回json数据 一般方法是通过在返回时构造一个响应头对象如下: public class ApiR extends HashMap<String, Object> { private static final long serialVersionUID = 1L; pub...

IManiy的博客 1975

springboot项目全局统一异常处理

前言 在springboot项目开发过程中,不可避免需要处理各种异常,因此各层会出现大量的try {...} catch {...} finally {...} 代码块。这样不仅导致代码冗余,还影响代码的可读性。这样就需要定义全局统一异常处理,方便各层调用不必单独捕获异常。 一、推荐理由 1.代码复制到项目中通过简单的配置即可实现 2.可以灵活的根据自己的业务异常进行更细粒度的扩展 二、使用步骤 1.封装统一返回结果类 代码如下(示例): public class AjaxRe...

lk的博客 288

SpringBoot项目统一异常处理方案(一)

本文介绍基于SpringBoot项目的三种统一异常处理方案,让项目发生的异常变得更加规范处理,更容易维护。

bin-brother的博客 520

SpringBoot实战项目学习(7)——进行统一异常处理

文章目录项目结构pom.xml配置文件application.yml页面模板error.html状态码封装类Status异常类异常基类BaseExceptionJSON异常类JsonException页面处理异常类PageException通用API接口封装类ApiResponse统一异常处理类DemoExceptionHandler测试控制器TestController测试 在Spring Boot中进行统一异常处理,包括两种方式的处理:第一种对常见API形式的接口进行异常处理统一封装返回格式;第二

Felix_hyfy的博客 692

springboot怎么返回404_Springboot项目统一异常处理

Springboot项目统一异常处理一.接口返回值封装基于目前大多数项目都采用前后端分离架构,所以后端接口统一返回值封装是比较重要的,便于前后端对接与统一处理。当然按各自项目约定实现即可,思路大同小异,下面是我的实现方式,仅供参考1. 定义Result对象,作为通用返回结果封装/** * @filename Result * * @description 通用返回结果封装 * * @author...

weixin_42302763的博客 535

Spring Boot项目系列(3)项目统一异常处理统一标准返回格式,统一错误返回

spring boot 项目 (3)----controller层,统一异常处理统一标准返回格式,统一错误返回码     前言 spring boot 项目中的MVC分层,在controller层我们需要做的是什么,统一项目中的返回格式,统一异常的统一处理,统一错误的返回码。项目中的三个统一息息相关,互相联系。 项目架构     1.统一标准返回格式      项目中在controller层出现的各种返回,例:List ,Map<String,Object&

weixin_43704107的博客 1065

SpringBoot项目统一异常处理方案(三)

利用SpringAOP实现统一异常处理 集合文章: SpringBoot项目统一异常处理方案(一) SpringBoot项目统一异常处理方案(二)

bin-brother的博客 642

统一异常处理:让Spring Boot项目异常更优雅

本文将深入研究在Spring Boot项目中使用统一异常处理的优势和最佳实践。我们将探讨如何通过全局异常处理机制来统一处理项目中的异常,提高用户体验,同时增加代码的可维护性。通过实际的代码示例和详细解释,读者将学会如何在Spring Boot应用中实施高效的统一异常处理策略。

学而时习之,不亦说乎?温故而知新,可以为师矣! 862

spring boot 项目中常用的统一异常处理

项目中,我们常用的统一异常定义主要依托于两个注解: @ControllerAdvice 里面包含注解如下: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component @ExceptionHandler 包含注解如下: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented 项目中的只用: 定义一个异

会飞的小蜗 385

SpringBoot项目统一异常处理方式

SpringBoot项目统一异常处理方式 方式一:返回Json串 @ControllerAdvice public class CommonExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody public Map<String, Object> exceptionHandler(HttpServletRequest req,HttpServletResponse resp,Exception e){

m0_50831101的博客 143
上一篇: Mycat学习笔记一(引言)
下一篇: Springboot未登录请求拦截器实现
Java猿人一枚
博客等级 码龄13年 13粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值