当前位置:   article > 正文

Springboot自定义异常处理超详细实现和使用_springboot 自定义异常 触发事务

springboot 自定义异常 触发事务

目录

一、序言

二、实现自定义异常处理过程

三、使用自定异常处理


一、序言

        本文主要围绕springboot项目实现和使用自定义异常处理,其中包含全部实现代码以及使用自定义异常处理的内容,需要小伙伴对springboot项目环境搭建有一定的理解能力。

二、实现自定义异常处理过程

        首先实现自定义异常处理的内容包含:异常服务接口类、异常处理枚举类、自定义异常类、规范返回值结构体类、全局异常处理控制类;

异常服务接口类:提供获取编码和描述的方法

  1. public interface BaseErrorInfoInterface {
  2. /**
  3. * 错误码
  4. * @return
  5. */
  6. String getResultCode();
  7. /**
  8. * 错误描述
  9. * @return
  10. */
  11. String getResultMsg();
  12. }

异常处理枚举类:实现 异常服务接口类的方法,并且定义数据操作异常的类型

  1. public enum ExceptionEnum implements BaseErrorInfoInterface {
  2. // 数据操作异常定义
  3. SUCCESS("2000", "请求成功!"),
  4. BODY_NOT_MATCH("4000", "请求的数据格式不符!"),
  5. SIGNATURE_NOT_MATCH("4001", "请求的数字签名不匹配!"),
  6. DATA_EMPTY("4002","数据为空!"),
  7. DATA_NOT_ENOUGH("4003", "数据不足!"),
  8. NOT_FOUND("4004", "数据不存在或已删除!"),
  9. DATA_FOUND("4005", "数据已存在!"),
  10. CODE_NOT_MATCH("4006", "验证码错误!"),
  11. CODE_TIME_OUT("4007", "验证码已过期!"),
  12. PASSWORD_NOT_MATCH("4008", "密码不一致!"),
  13. INTERNAL_SERVER_ERROR("5000", "服务器内部错误!"),
  14. SERVER_BUSY("5003", "服务器正忙,请稍后再试!");
  15. /**
  16. * 错误码
  17. */
  18. private final String resultCode;
  19. /**
  20. * 错误描述
  21. */
  22. private final String resultMsg;
  23. ExceptionEnum(String resultCode, String resultMsg) {
  24. this.resultCode = resultCode;
  25. this.resultMsg = resultMsg;
  26. }
  27. @Override
  28. public String getResultCode() {
  29. return resultCode;
  30. }
  31. @Override
  32. public String getResultMsg() {
  33. return resultMsg;
  34. }
  35. }

         以上数据操作异常的定义作为参考,同志们可以根据自己的需求修改;


自定义异常类:获取错误码和错误信息;以及利用构造方法实例化异常处理类,并设置错误码和错误信息

  1. public class CustomizationException extends RuntimeException {
  2. private static final long serialVersionUID = 1L;
  3. /**
  4. * 错误码
  5. */
  6. protected String errorCode;
  7. /**
  8. * 错误信息
  9. */
  10. protected String errorMsg;
  11. public CustomizationException() {
  12. super();
  13. }
  14. public CustomizationException(BaseErrorInfoInterface errorInfoInterface) {
  15. super(errorInfoInterface.getResultCode());
  16. this.errorCode = errorInfoInterface.getResultCode();
  17. this.errorMsg = errorInfoInterface.getResultMsg();
  18. }
  19. public CustomizationException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {
  20. super(errorInfoInterface.getResultCode(), cause);
  21. this.errorCode = errorInfoInterface.getResultCode();
  22. this.errorMsg = errorInfoInterface.getResultMsg();
  23. }
  24. public CustomizationException(String errorMsg) {
  25. super(errorMsg);
  26. this.errorMsg = errorMsg;
  27. }
  28. public CustomizationException(String errorCode, String errorMsg) {
  29. super(errorCode);
  30. this.errorCode = errorCode;
  31. this.errorMsg = errorMsg;
  32. }
  33. public CustomizationException(String errorCode, String errorMsg, Throwable cause) {
  34. super(errorCode, cause);
  35. this.errorCode = errorCode;
  36. this.errorMsg = errorMsg;
  37. }
  38. public String getErrorCode() {
  39. return errorCode;
  40. }
  41. public void setErrorCode(String errorCode) {
  42. this.errorCode = errorCode;
  43. }
  44. public String getErrorMsg() {
  45. return errorMsg;
  46. }
  47. public void setErrorMsg(String errorMsg) {
  48. this.errorMsg = errorMsg;
  49. }
  50. @Override
  51. public Throwable fillInStackTrace() {
  52. return this;
  53. }
  54. }

规范返回值结构体类:属于规范方法返回值结构体的类,也有利于一致化后端所有接口的返回结构,方便前端(客户端)读取所需要的数据;异常处理返回客户端的数据将采用该类的数据结构;

  1. @Data
  2. public class ResultAPI {
  3. private int status; //响应状态
  4. private String msg; //相应消息
  5. private String code;//响应代码
  6. public ResultAPI(){}
  7. /** 失败 **/
  8. public static ResultAPI error(BaseErrorInfoInterface errorInfo) {
  9. ResultAPI result = new ResultAPI();
  10. result.setCode(errorInfo.getResultCode());
  11. result.setMsg(errorInfo.getResultMsg());
  12. result.setStatus(0);
  13. return result;
  14. }
  15. /** 失败 **/
  16. public static ResultAPI error(String code, String message) {
  17. ResultAPI result = new ResultAPI();
  18. result.setCode(code);
  19. result.setMsg(message);
  20. result.setStatus(0);
  21. return result;
  22. }
  23. /** 失败 **/
  24. public static ResultAPI error(String message) {
  25. ResultAPI result = new ResultAPI();
  26. result.setStatus(0);
  27. result.setMsg(message);
  28. return result;
  29. }
  30. }

注入lombok依赖,为运用@Data注解,使ResultAPI 类相当于一个pojo类,拥有get,set方法;

打开pom.xml,添加以下语句 ,并加载Maven变更:

  1. <dependency>
  2.             <groupId>org.projectlombok</groupId>
  3.             <artifactId>lombok</artifactId>
  4. </dependency>

 全局异常处理控制类 :处理各类异常的业务(即根据不同的异常类型向客户端返回相应的信息)

  1. @ControllerAdvice
  2. public class GlobalExceptionController {
  3. /**
  4. * 处理自定义的业务异常
  5. * @param req
  6. * @param exception
  7. * @return
  8. */
  9. @ExceptionHandler(value = CustomizationException.class)
  10. @ResponseBody
  11. public ResultAPI exception(HttpServletRequest req, CustomizationException exception) {
  12. return ResultAPI.error(exception.getErrorCode(), exception.getErrorMsg());
  13. }
  14. /**
  15. * 处理空指针的异常
  16. * @param req
  17. * @param e
  18. * @return
  19. */
  20. @ExceptionHandler(value = NullPointerException.class)
  21. @ResponseBody
  22. public ResultAPI exceptionHandler(HttpServletRequest req, NullPointerException e) {
  23. return ResultAPI.error(ExceptionEnum.BODY_NOT_MATCH);
  24. }
  25. }

三、使用自定义异常处理

第一步:创建测试控制类TestController,添加@RestController  和  @RequestMapping注解

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestController {
  4. }

在pom.xml 文件中添加依赖(如已添加,忽略此步骤):

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

第二步:添加方法,根据需求添加自定义异常处理,例如:参数为空时抛出异常并处理。

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestController {
  4. @RequestMapping("/exception")
  5. public String exceptionTest(String data) {
  6. if (data == null) {
  7. throw new CustomizationException(ExceptionEnum.DATA_EMPTY.getResultCode(),
  8. ExceptionEnum.DATA_EMPTY.getResultMsg());
  9. }
  10. return data;
  11. }
  12. }

第三步:用postMan或者Apifox软件测试,发送请求

 注意springboot的端口号与测试软件的端口号一致

发送请求:http://localhost:8888/test/exception

类型一:参数为data,值为Junny

结果:

类型二:参数为空

 结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/数据可视化灵魂/article/detail/62652
推荐阅读
相关标签
  

闽ICP备14008679号