【spring】-- springboot配置全局异常处理器

一、为什么要使用全局异常处理器?

什么是全局异常处理器?

就是把错误异常统一处理的方法。

应用场景

1、当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句直接捕获,这时可以使用全局异常处理器来捕捉该异常。

2、当你自定义了一个异常类,可以在全局异常处理器中来捕捉该异常。(当然也可以直接在抛出异常处直接捕获,但是这样需要在每一个抛出的地方都写一次捕获代码,看起来不够美观且复用性不强,其他异常同理)。

所有异常都可以在全局异常处理器中捕获进行统一处理

二、具体使用步骤

1、定义统一的请求返回类型

public class Result<T> {
    private int code;
    private String msg;
    private T data;

    /**
     * 请求成功时调用
     * @param data
     * @return
     */
    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);
    }

    /**
     * 只传入数据默认成功,所以添加默认的code和msg
     * @param data
     */
    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();
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public T getData() {
        return data;
    }

}
public class CodeMsg {

    private int code;
    private String msg;

    //通用的错误码
    public static CodeMsg SUCCESS = new CodeMsg(0, "success");
    public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常");
    public static CodeMsg BIND_ERROR = new CodeMsg(500101, "参数校验异常:%s");
    //登录模块 5002XX
    public static CodeMsg SESSION_ERROR = new CodeMsg(500210, "Session不存在或者已经失效");
    public static CodeMsg PASSWORD_EMPTY = new CodeMsg(500211, "登录密码不能为空");
    public static CodeMsg STUDENTID_EMPTY = new CodeMsg(500212, "学号不能为空");
    public static CodeMsg STUDENTID_ERROR = new CodeMsg(500213, "学号格式错误");
    public static CodeMsg STUDENTIDE_NOT_EXIST = new CodeMsg(500214, "学号不存在");
    public static CodeMsg PASSWORD_ERROR = new CodeMsg(500215, "密码错误");

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public CodeMsg fillArgs(Object... args) {
        int code = this.code;
        String message = String.format(this.msg, args);
        return new CodeMsg(code, message);
    }

    private CodeMsg(int code,String msg) {
        this.code = code;
        this.msg = msg;
    }

}

2、定义自己的异常类

public class GlobalException extends RuntimeException{

    private static final long serialVersionUID = 1L;

    private CodeMsg cm;

    public GlobalException(CodeMsg cm) {
        super(cm.toString());
        this.cm = cm;
    }

    public CodeMsg getCm() {
        return cm;
    }

}

3、定义全局异常处理器

@ControllerAdvice //该注解定义全局异常处理类
//@ControllerAdvice(basePackages ="com.example.demo.controller") 可指定包
@ResponseBody
public class GlobalExceptionHandler {
    @ExceptionHandler(value=Exception.class) //该注解声明异常处理方法
    public Result<String> exceptionHandler(HttpServletRequest request, Exception e){
        e.printStackTrace();
        //对于自定义异常的处理
        if(e instanceof GlobalException) {
            GlobalException ex = (GlobalException)e;
            return Result.error(ex.getCm());
        //对于绑定异常的处理,使用jsr303中的自定义注解抛出的异常属于绑定异常
        }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);
        }
    }
}

4、使用自己的定义的异常类

if(user == null) {
    throw new GlobalException(CodeMsg.STUDENTIDE_NOT_EXIST);
}

看到的更容易理解一篇文章:https://www.cnblogs.com/zs-notes/p/9366066.html

原文地址:https://www.cnblogs.com/jsyllhb/p/10580011.html

时间: 2024-10-09 23:38:26

【spring】-- springboot配置全局异常处理器的相关文章

Spring Boot 中全局异常处理器

Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloController类 修改HelloController,使得访问/hello一定会产生异常: some exception package cn.xdf.springboot.web; import java.text.DateFormat; import java.util.Date; import

SpringBoot配置全局异常捕获

1 SpringBoot配置全局的异常捕获 项目的说明 配置thymeleaf作为视图模板 ExceptionController.java模拟测试用 MyAjaxExceptionHandler.java捕获到异常以ajax形式返回 MyExceptionHandler.java捕获到异常以页面形式返回 ajaxerror.html这个是测试返回ajax异常的页面 error.html以页面形式返回的异常到这个页面 1.1 页面跳转形式 1.1.1 配置 MyExceptionHandler.

SpringBoot(6) SpringBoot配置全局异常

1.全局异常 @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody //捕获全局异常,处理所有不可知的异常 @ExceptionHandler(value=Exception.class) 1 @RestControllerAdvice 2 public class CustomExtHandler { 3 4 private static final Logger LOG = LoggerFactor

springboot配置全局异常

第一步 controller中 package cn.itcast.springboot.controller; import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody; import cn.itcast.spri

springboot捕获全局异常和配置多数据源

目录 配置多数据源 写两个数据源的配置类. @(springboot捕获全局异常和配置多数据源) 捕获全局异常是在项目运行期间如果调用的某一个方法出现了运行时异常,则会捕获,并且给出回馈. 首先需要建一个包,包里新建一个捕获异常类GlobalExceptionHandler.前提是springboot的启动类的扫描注解ComponentScan()要扫描到. /** * 用于捕获全局异常 */ @ControllerAdvice//控制器切面 public class GlobalExcepti

springmvc中拦截器与springmvc全局异常处理器的问题

最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 中抛出了系统自定义异常, 当时有有个疑惑, 就是抛出的这个异常全局异常处理器怎么处理的. 这里的全局异常处理器时通过实现HandlerExceptionResolver这个借口实现的 要指出的是 resolveException方法 中 handler中代表的是什么,我没遇到这个问题之前我认为这玩

spring boot 配置全局日期类型转换器

首先自定义一个类型转换器 import org.springframework.core.convert.converter.Converter;import org.springframework.stereotype.Component; import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date; @Componentpublic class MyDataConvert im

springboot中全局异常,系统配置

1.springboot中的异常 package com.ithuan.demo; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.b

自定义全局异常处理器

public class RtopExceptionHandler implements HandlerExceptionResolver{ private static final Logger logger = LoggerFactory.getLogger(RtopExceptionHandler.class); @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletRes