全局异常类的处理
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;
}
调用结果: