微服务springboot中全局异常类的处理

全局异常类的处理

1.在整个微服务项目中,一般需要定义全局的异常处理类方便处理各种异常问题,防止出现从sever层一直抛出到controller的冗余代码

做法1:在公共部分定义异常处理类,异常处理枚举类,全局异常处理增强controller,各项目直接沿用
做法2:在公共部分定义异常处理类,异常处理枚举类,全局异常处理增强controller,各个项目在此基础上继承异常类,并在新定义的异常类中新建有参构造函数使用本项目的异常类

一般采用第二种方法,全局设置只提供公共部分,各项目根据实际情况创建异常类,异常枚举类扩展使用。尽量不要所有项目的都耦合在一起
下面已第二点来说:
公共部分
1.定义全局异常类

/**
 * @Classname LyException
 * @Description 全局异常处理类
 * @Date 2022/2/3 20:30
 * @Author likang
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class LyException extends RuntimeException {
    private Integer status;


    public LyException(String message, Integer status) {
        super(message);
        this.status = status;
    }

    public LyException(ExceptionEnum exceptionEnum) {
        super(exceptionEnum.getMessage());
        this.status = exceptionEnum.getStatus();
    }
}

2.定义全局异常枚举类 配合使用

/**
 * @Classname ExceptionEnum
 * @Description 公共的异常枚举类
 * @Date 2022/2/3 20:39
 * @Author likang
 */
@Getter
public enum ExceptionEnum {
    /**
     * 文件类型错误时使用
     */
    INVALID_FILE_TYPE(400, "无效的文件类型!"),
    INVALID_PARAM_ERROR(400, "无效的请求参数!"),
    INVALID_PHONE_NUMBER(400, "无效的手机号码"),
    INVALID_VERIFY_CODE(400, "验证码错误!"),
    INVALID_USERNAME_PASSWORD(400, "无效的用户名和密码!"),
    INVALID_SERVER_ID_SECRET(400, "无效的服务id和密钥!"),
    INVALID_NOTIFY_PARAM(400, "回调参数有误!"),
    INVALID_NOTIFY_SIGN(400, "回调签名有误!"),
    UNAUTHORIZED(401, "登录失效或未登录!");
    /**
     * 状态码
     */
    private int status;
    /**
     * 异常信息
     */
    private String message;

    ExceptionEnum(int status, String message) {
        this.status = status;
        this.message = message;
    }
}

3.创建全局异常处理controller拦截 并定义返回结果,这三步骤写在微服务的公共部分中install到其他项目使用。注意pom中的依赖,公共部分打包没有main函数入口maven打包插件修改一下

           <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>

在这里我用JsonResult作为返回类的原因是所有的项目返回结果都是JsonResult,所以抛出异常也一样方便前端处理,至此已经能用了,怕麻烦的老哥们可以直接throw new LyException()

/**
 * @Classname LyExceptionController
 * @Description 全局异常处理增强
 * @Date 2022/2/3 20:26
 * @Author likang
 */
@ControllerAdvice
public class LyExceptionController {
    /**
     * 使用LyException类中的status作为response返回的状态码
     * @param e 抛出的异常
     * @return response信息
     */
    @ExceptionHandler(value = LyException.class)
    @ResponseBody
    public JsonResult handleException(LyException e){
        return new JsonResult(false, e.getStatus(), e.getMessage(), null);
    }
}

4.user项目中定义本项目的异常类继承通用异常类

/**
 * @Classname UserException
 * @Description 用户异常类
 * @Date 2022/2/3 20:56
 * @Author likang
 */
public class UserException extends LyException {
    public UserException(UserExceptionEnum userExceptionEnum){
        super(userExceptionEnum.getMessage(),userExceptionEnum.getStatus());
    }
}

5.创建本项目枚举类

/**
 * @Classname UserExceptionEnum
 * @Description 用户人员信息异常类枚举
 * @Date 2022/2/3 20:51
 * @Author likang
 */
@Getter
public enum UserExceptionEnum  {
    /**
     * 参数无效时使用
     */
    INVALID_PARAM_ERROR(400, "无效的请求参数!");
    /**
     * 状态码
     */
    private int status;
    /**
     * 异常信息
     */
    private String message;

    UserExceptionEnum(int status, String message) {
        this.status = status;
        this.message = message;
    }
}

至此已经OK,下面测试一下:
这是userService演示代码:

    @Override
    @Transactional
    public User register(User user) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", user.getUsername());
//                .eq("corp_code", user.getCorpCode());
        User selectUser = userMapper.selectOne(queryWrapper);
        if (null != selectUser){
            throw new UserException(UserExceptionEnum.INVALID_PARAM_ERROR);
        }
        userMapper.insert(user);
        return user;
    }

调用结果:

测试结果

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值