springboot断言异常封装与统一异常处理实现代码

 更新时间:2023年01月11日 11:27:30   作者:WalkerShen  
异常处理其实一直都是项目开发中的大头,但关注异常处理的人一直都特别少,下面这篇文章主要给大家介绍了关于springboot断言异常封装与统一异常处理的相关资料,需要的朋友可以参考下

步骤

1、异常类

package com.walker.dianping.common.exceptions;

import lombok.Data;

@Data
//继承RuntimeException
public class BizException extends RuntimeException {

    private String msg;

    public BizException(String msg) {
        super(msg);  //此处记得实例化
        this.msg = msg;
    }
}

2、统一异常处理配置类

package com.walker.dianping.common.config;

import com.walker.dianping.common.exceptions.BizException;
import com.walker.dianping.model.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Slf4j
public class MyExceptionHandler {

    @ExceptionHandler(value = BizException.class)
    public R BizExceptionHandler(Exception e) {
        log.error("错误原因是:" + e.getMessage());
        return R.fail("系统异常,原因如下:"+e.getMessage());
    }

    @ExceptionHandler(value = Exception.class)
    public R exceptionHandler(Exception e) {
        log.error("错误原因是:" + e.getMessage());
        return R.fail(e.getMessage());
    }
}

3、断言类

可以自己进行补充

package com.walker.dianping.common.utils;

import com.walker.dianping.common.exceptions.BizException;
import org.apache.commons.lang3.StringUtils;

public abstract class Assert {

    //如果字符串为空的话,就抛出异常
    public static void isBlank(String str, String message) {
        if (StringUtils.isBlank(str)) {
            throw new BizException(message);
        }
    }

    public static void isNull(Object object, String message) {
        if (object == null) {
            throw new BizException(message);
        }
    }
}

4、使用

//查询类,如果类不存在则抛出异常
TbSeckillVoucherEntity entity = getById(voucherId);
 Assert.isNull(entity,"该"+voucherId+"优惠券不存在");

可以让代码变得相对简洁

接下来分别对这几种异常处理器做详细说明。

补充:异常处理器说明

handleServletException

一个http请求,在到达Controller前,会对该请求的请求信息与目标控制器信息做一系列校验。这里简单说一下:NoHandlerFoundException:首先根据请求Url查找有没有对应的控制器,若没有则会抛该异常,也就是大家非常熟悉的404异常;

HttpRequestMethodNotSupportedException:若匹配到了(匹配结果是一个列表,不同的是http方法不同,如:Get、Post等),则尝试将请求的http方法与列表的控制器做匹配,若没有对应http方法的控制器,则抛该异常;

HttpMediaTypeNotSupportedException:然后再对请求头与控制器支持的做比较,比如content-type请求头,若控制器的参数签名包含注解@RequestBody,但是请求的content-type请求头的值没有包含application/json,那么会抛该异常(当然,不止这种情况会抛这个异常);MissingPathVariableException:未检测到路径参数。比如url为:/licence/{licenceId},参数签名包含@PathVariable("licenceId"),当请求的url为/licence,在没有明确定义url为/licence的情况下,会被判定为:缺少路径参数;

MissingServletRequestParameterException:缺少请求参数。比如定义了参数@RequestParam("licenceId") String licenceId,但发起请求时,未携带该参数,则会抛该异常;TypeMismatchException: 参数类型匹配失败。比如:接收参数为Long型,但传入的值确是一个字符串,那么将会出现类型转换失败的情况,这时会抛该异常;

HttpMessageNotReadableException:与上面的HttpMediaTypeNotSupportedException举的例子完全相反,即请求头携带了"content-type: application/json;charset=UTF-8",但接收参数却没有添加注解@RequestBody,或者请求体携带的 json 串反序列化成 pojo 的过程中失败了,也会抛该异常;HttpMessageNotWritableException:返回的 pojo 在序列化成 json 过程失败了,那么抛该异常;

handleBindException

参数校验异常,后文详细说明。

handleValidException

参数校验异常,后文详细说明。

handleBusinessException、handleBaseException

处理自定义的业务异常,只是handleBaseException处理的是除了 BusinessException 意外的所有业务异常。就目前来看,这2个是可以合并成一个的。

handleException

处理所有未知的异常,比如操作数据库失败的异常。

注:上面的 handleServletException、 handleException 这两个处理器,返回的异常信息,不同环境返回的可能不一样,以为这些异常信息都是框架自带的异常信息,一般都是英文的,不太好直接展示给用户看,所以统一返回 SERVER_ERROR代表的异常信息。

总结

到此这篇关于springboot断言异常封装与统一异常处理实现的文章就介绍到这了,更多相关springboot断言异常封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot下mybatis-plus开启打印sql日志的配置指南

    springboot下mybatis-plus开启打印sql日志的配置指南

    这篇文章主要给大家介绍了关于springboot下mybatis-plus开启打印sql日志的配置指南的相关资料,还介绍了关闭打印的方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • springboot跨域CORS处理代码解析

    springboot跨域CORS处理代码解析

    这篇文章主要介绍了springboot跨域CORS处理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 使用SpringMVC访问Controller接口返回400BadRequest

    使用SpringMVC访问Controller接口返回400BadRequest

    这篇文章主要介绍了使用SpringMVC访问Controller接口返回400BadRequest,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Json字符串转Java对象和List代码实例

    Json字符串转Java对象和List代码实例

    这篇文章主要介绍了Json字符串转Java对象和List代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Mybatis Criteria使用and和or进行联合条件查询的操作方法

    Mybatis Criteria使用and和or进行联合条件查询的操作方法

    这篇文章主要介绍了Mybatis Criteria的and和or进行联合条件查询的方法,本文通过例子给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • SpringBoot统一数据返回的方法实现

    SpringBoot统一数据返回的方法实现

    在前后端交互过程中,为了便于数据处理,后端数据需要进行统一封装返回给前端,这种做法不仅方便前后端沟通,降低了沟通成本,还有助于项目的统一维护和后端技术部门的规范制定,本文就来介绍一下
    2024-10-10
  • maven pom中内置变量及引用的实现

    maven pom中内置变量及引用的实现

    maven其实有很多内置变量供开发着在开发中使用,本文主要介绍了maven pom中内置变量及引用的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Springboot实现自定义错误页面的方法(错误处理机制)

    Springboot实现自定义错误页面的方法(错误处理机制)

    这篇文章主要介绍了Springboot实现自定义错误页面的方法(错误处理机制),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • JavaWeb通过IDEA配置Servlet操作流程详解

    JavaWeb通过IDEA配置Servlet操作流程详解

    这篇文章主要介绍了JavaWeb通过IDEA配置Servlet实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • SpringBoot中热部署配置深入讲解原理

    SpringBoot中热部署配置深入讲解原理

    在实际开发中,每次修改代码就需要重启项目,重新部署,对于一个后端开发者来说,重启确实很难受。在java开发领域,热部署一直是一个难以解决的问题,目前java虚拟机只能实现方法体的热部署,对于整个类的结构修改,仍然需要重启项目
    2023-01-01

最新评论