广告
返回顶部
首页 > 资讯 > 精选 >springboot如何实现全局异常处理及自定义异常类
  • 166
分享到

springboot如何实现全局异常处理及自定义异常类

2023-06-29 07:06:54 166人浏览 独家记忆
摘要

这篇文章主要介绍SpringBoot如何实现全局异常处理及自定义异常类,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!全局异常处理及自定义异常类全局异常处理定义一个处理类,使用@ControllerAdvice注解。@

这篇文章主要介绍SpringBoot如何实现全局异常处理及自定义异常类,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

全局异常处理及自定义异常类

全局异常处理

定义一个处理类,使用@ControllerAdvice注解。

@ControllerAdvice注解:控制器增强,一个被@Component注册的组件。

配合@ExceptionHandler来增强所有的@requestMapping方法。

例如:@ExceptionHandler(Exception.class)  用来捕获@requestMapping的方法中所有抛出的exception。

代码:

@ControllerAdvicepublic class GlobalDefultExceptionHandler {        //声明要捕获的异常    @ExceptionHandler(Exception.class)    @ResponseBody    public String defultExcepitonHandler(httpservletRequest request,Exception e) {        return “error”;    }}

这样,全局异常处理类完毕。可以添加自己的逻辑。

然后还有一个问题,有的时候,我们需要业务逻辑时抛出自定义异常,这个时候需要自定义业务异常类。

定义class:BusinessException ,使他继承于RuntimeException.

说明:因为某些业务需要进行业务回滚。但spring事务只针对RuntimeException的进行回滚操作。所以需要回滚就要继承RuntimeException。

public class BusinessException extends RuntimeException{ }

然后,现在来稍微完善一下这个类。

当我们抛出一个业务异常,一般需要错误码和错误信息。有助于我们来定位问题。

所以如下:

public class BusinessException extends RuntimeException{    //自定义错误码    private Integer code;    //自定义构造器,只保留一个,让其必须输入错误码及内容    public BusinessException(int code,String msg) {        super(msg);        this.code = code;    }     public Integer getCode() {        return code;    }     public void setCode(Integer code) {        this.code = code;    }}

这时候,我们发现还有一个问题,如果这样写,在代码多起来以后,很难管理这些业务异常和错误码之间的匹配。所以在优化一下。

把错误码及错误信息,组装起来统一管理。

定义一个业务异常的枚举

public enum ResultEnum {    UNKONW_ERROR(-1,"未知错误"),    SUCCESS(0,"成功"),    ERROR(1,"失败"),    ;        private Integer code;    private String msg;        ResultEnum(Integer code,String msg) {        this.code = code;        this.msg = msg;    }     public Integer getCode() {        return code;    }     public String getMsg() {        return msg;    }}

这个时候,业务异常类:

public class BusinessException extends RuntimeException{        private static final long serialVersionUID = 1L;        private Integer code;  //错误码     public BusinessException() {}        public BusinessException(ResultEnum resultEnum) {        super(resultEnum.getMsg());        this.code = resultEnum.getCode();    }        public Integer getCode() {        return code;    }     public void setCode(Integer code) {        this.code = code;    }}

然后再修改一下全局异常处理类:

@ControllerAdvicepublic class GlobalDefultExceptionHandler {        //声明要捕获的异常    @ExceptionHandler(Exception.class)    @ResponseBody    public <T> Result<?> defultExcepitonHandler(HttpServletRequest request,Exception e) {        e.printStackTrace();        if(e instanceof BusinessException) {            Log.error(this.getClass(),"业务异常:"+e.getMessage());            BusinessException businessException = (BusinessException)e;            return ResultUtil.error(businessException.getCode(), businessException.getMessage());        }        //未知错误        return ResultUtil.error(-1, "系统异常:\\n"+e);    }    }

判断这个是否是业务异常。和系统异常就可以分开处理了。 

全局异常处理配置

springboot Restful使用

@ControllerAdvice、@ExceptionHandler、@ResponseBody实现全局异常处理

  • @ControllerAdvice 注解定义全局异常处理类

  • @ExceptionHandler 指定自定义错误处理方法拦截的异常类型

同一个异常被小范围的异常类和大范围的异常处理器同时覆盖,会选择小范围的异常处理器

1.定义异常业务类

public class ExceptionVO {    private String errorCode;    private String message;    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }    public String getErrorCode() {        return errorCode;    }    public void setErrorCode(String errorCode) {        this.errorCode = errorCode;    }}

2.定义自定义异常

package exception;public class NotFoundException extends SystemException {    public NotFoundException(String message) {        super(message);    }}public class SystemException extends RuntimeException {    private static final long serialVersionUID = 1095242212086237834L;    protected Object errorCode;    protected Object[] args;    public SystemException() {        super();    }    public SystemException(String message, Throwable cause) {        super(message, cause);    }    public SystemException(String message) {        super(message);    }    public SystemException(String message, Object[] args, Throwable cause) {        super(message, cause);        this.args = args;    }    public SystemException(String message, Object[] args) {        super(message);        this.args = args;    }    public SystemException(Object errorCode, String message, Throwable cause) {        super(message, cause);        this.errorCode = errorCode;    }    public SystemException(Object errorCode, String message) {        super(message);        this.errorCode = errorCode;    }    public SystemException(Object errorCode, String message, Object[] args, Throwable cause) {        super(message, cause);        this.args = args;        this.errorCode = errorCode;    }    public SystemException(Object errorCode, String message, Object[] args) {        super(message);        this.args = args;        this.errorCode = errorCode;    }    public SystemException(Throwable cause) {        super(cause);    }    public Object[] getArgs() {        return args;    }    public Object getErrorCode() {        return errorCode;    }}

3.定义全局异常处理类

import java.util.HashMap;import java.util.Map;import java.util.stream.Collectors;import NotFoundException;import org.apache.commons.collections.CollectionUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.MessageSource;import org.springframework.context.NoSuchMessageException;import org.springframework.context.i18n.LocaleContextHolder;import org.springframework.http.HttpStatus;import org.springframework.validation.BindException;import org.springframework.validation.FieldError;import org.springframework.WEB.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.ResponseStatus;import ExceptionVO;@ControllerAdvice("web") //指定异常处理期拦截范围public class WebExceptionHandler {    static Logger LOG = LoggerFactory.getLogger(WebExceptionHandler.class);    @Autowired    private MessageSource messageSource;    @ExceptionHandler(FieldException.class)    @ResponseStatus(HttpStatus.CONFLICT) //指定http响应状态    @ResponseBody        @ExceptionHandler(NotFoundException.class)//指定异常类型    @ResponseStatus(HttpStatus.NOT_FOUND)    @ResponseBody    public ExceptionVO handleNotFoundException(NotFoundException e) {        ExceptionVO vo = new ExceptionVO();        fillExceptionVO(e, vo);        return vo;    }    @ExceptionHandler(SystemException.class)    @ResponseStatus(HttpStatus.CONFLICT)    @ResponseBody    public ExceptionVO handleSystemException(SystemException e) {        ExceptionVO vo = new ExceptionVO();        fillExceptionVO(e, vo);        return vo;    }    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)    @ExceptionHandler(Exception.class)    public void globalError(Exception e) {        LOG.error(e.getMessage(), e);    }        private void fillExceptionVO(SystemException e, ExceptionVO vo) {        if (e.getMessage() != null) {            String message = e.getMessage();            try {                message = messageSource.getMessage(e.getMessage(), e.getArgs(), LocaleContextHolder.getLocale());            } catch (NoSuchMessageException ex) {                ; // ignore            }            vo.setMessage(message);        }        vo.setErrorCode(String.valueOf(e.getErrorCode()));    }}

springboot 返回 ModelAndView

package exception.handler;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerExceptionResolver;import org.springframework.web.servlet.ModelAndView;@Commpentpublic class OverallExceptionHandler implements HandlerExceptionResolver {    @Override    public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,            Exception ex) {        ModelAndView mav = new ModelAndView();        System.out.println(ex.getMessage());        mav.addObject("errMsg", ex.getMessage());        mav.setViewName("error");        return mav;    }}

其它方式:

@ControllerAdvicepublic class GlobalExceptionHandler {      @ExceptionHandler(value = Exception.class)      public ModelAndView resolveException(HttpServletRequest request, Exception ex) throws Exception {        ModelAndView mav = new ModelAndView();        System.out.println(ex.getMessage());        mav.addObject("errMsg", ex.getMessage());        mav.setViewName("error");        return mav;      }}

以上是“springboot如何实现全局异常处理及自定义异常类”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: springboot如何实现全局异常处理及自定义异常类

本文链接: https://www.lsjlt.com/news/323217.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot实现全局异常处理及自定义异常类
    目录全局异常处理及自定义异常类全局异常处理定义一个业务异常的枚举全局异常处理配置springboot Restful使用springboot 返回 ModelAndView全局异常处...
    99+
    2022-11-13
  • springboot如何实现全局异常处理及自定义异常类
    这篇文章主要介绍springboot如何实现全局异常处理及自定义异常类,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!全局异常处理及自定义异常类全局异常处理定义一个处理类,使用@ControllerAdvice注解。@...
    99+
    2023-06-29
  • SpringBoot Security如何自定义异常处理
    这篇文章主要为大家展示了“SpringBoot Security如何自定义异常处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot Security如何自定...
    99+
    2023-06-22
  • SpringBoot+Hibernate实现自定义数据验证及异常处理
    目录前言Hibernate实现字段校验自定义校验注解使用AOP处理校验异常全局异常类处理异常前言 在进行 SpringBoot 项目开发中,经常会碰到属性合法性问题,而面对这个问题通...
    99+
    2022-11-13
  • SpringBoot Security的自定义异常处理
    目录SpringBoot Security自定义异常access_denied 方面异常Invalid access token 方面异常Bad credentials 方面异常(登...
    99+
    2022-11-12
  • Springboot项目中如何实现异常处理自定义
    这期内容当中小编将会给大家带来有关Springboot项目中如何实现异常处理自定义,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。背景Springboot 默认把异常的处理集中到一个ModelAndView...
    99+
    2023-05-31
    springboot 异常处理 目中
  • Java中如何实现Springboot全局异常处理
    这篇文章主要为大家展示了“Java中如何实现Springboot全局异常处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中如何实现Springboot全局异常处理”这篇文章吧。一、思路...
    99+
    2023-06-25
  • 如何使用SpringBoot处理全局异常
    如何使用SpringBoot处理全局异常 使用@ControllerAdvice 和 @ExceptionHandler处理全局异常 参考: @ControllerAdvice@ResponseBod...
    99+
    2023-10-27
    spring boot java 后端 异常处理
  • SpringBoot实现全局异常处理方法总结
    目录全局异常处理配置全局异常全局异常处理的升级加入自定义异常处理处理 Controller 数据绑定、数据校验的异常GlobalExceptionHandler全部代码总结在项目开发...
    99+
    2022-11-13
  • 如何在SpringBoot中实现全局异常处理方式
    如何在SpringBoot中实现全局异常处理方式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springboot是什么springboot一种全新的编程规范,...
    99+
    2023-06-14
  • SpringBoot详解实现自定义异常处理页面方法
    目录1.相关介绍2.代码实现3.运行测试1.相关介绍 当发生异常时, 跳转到我们自定义的异常处理页面. SpringBoot中只需在静态资源目录下创建一个error文件夹, 并把异常...
    99+
    2022-11-13
  • PHP如何自定义异常类
    小编给大家分享一下PHP如何自定义异常类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  class MyE...
    99+
    2022-10-19
  • SpringBoot统一接口返回及全局异常如何处理
    这篇文章主要介绍“SpringBoot统一接口返回及全局异常如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot统一接口返回及全局异常如何处理”文章能帮助大家解决问题。一、Sp...
    99+
    2023-07-02
  • python怎么实现自定义异常类
    本篇内容介绍了“python怎么实现自定义异常类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明通常可以继承Exception或子类。命名...
    99+
    2023-06-30
  • springboot如何自定义异常并捕获异常返给前端
    小编给大家分享一下springboot如何自定义异常并捕获异常返给前端,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景在开发中,如果用try catch的方式,...
    99+
    2023-06-25
  • 使用aop实现全局异常处理
    本文实例为大家分享了使用aop实现全局异常处理的具体代码,供大家参考,具体内容如下 日常业务中存在的问题 使用大量的try/catch来捕获异常导致整个控制层代码可读性极差,并且此类...
    99+
    2022-11-13
  • go怎么实现全局异常处理
    要实现Go语言的全局异常处理,可以使用defer和recover来捕获和处理panic异常。 在Go语言中,defer语句会在函数结...
    99+
    2023-10-20
    go
  • SpringBoot统一接口返回及全局异常怎么处理
    今天小编给大家分享一下SpringBoot统一接口返回及全局异常怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、S...
    99+
    2023-07-06
  • springboot 自定义异常并捕获异常返给前端的实现代码
    背景 在开发中,如果用try catch的方式,每个方法都需要单独实现,为了方便分类异常,返回给前端,采用了@ControllerAdvice注解和继承了RuntimeExcepti...
    99+
    2022-11-12
  • Java中的异常类怎么实现自定义
    Java中的异常类怎么实现自定义?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java自定义异常类的实例详解为什么要自己编写异常类?假如jdk里面没有提供的异常...
    99+
    2023-05-31
    java ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作