如何为spring配置全局抛出异常注解

0.首先了解一个注解@ControllerAdvice,他是spring里的一个注解,用于定义全局逻辑异常、数据绑定、请求处理等逻辑,与@ExceptionHandler等注解使用。

ControllerAdvice本质上就是一个Component,他用于对controller实现aop,

这里我们就是配合exceptionHandler捕获并抛出异常给前端

1.先定义一个我们自己的异常类,继承运行时异常

@NoArgsConstructor
@AllArgsConstructor
@Getter
public class MyException extends RuntimeException{
    private String errMessage;
}

2.定义一个与前端约定好的异常类

@Data
@AllArgsConstructor
public class RestErrorResponse implements Serializable {
    private String errMessage;

}

3.通过controllerAdvice进行全局配置,这里我们是自己写的异常就正常抛出即可,其他异常直接统一抛出未知错误(比如经典的遇到了1/0)

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseBody
    @ExceptionHandler(MyException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse customException(MyException myException){
        log.error("系统异常{}",myException.getErrMessage(),myException);
        // 解析异常
        String errMessage = myException.getErrMessage();
        return new RestErrorResponse(errMessage);
    }
    @ResponseBody
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse exception(Exception e){
        log.error("系统异常{}",e.getMessage(),e);
        return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
    }
}

 

拓展:关于扫描问题,这里我的配置是没有错的,但是一直不走这个路线,直接throw就没了。后面我发现其实是我的启动类放错了位置。

我的配置模块是位于xuecheng-plus-base/src/main/java/com/xuecheng/base/exception/GlobalExceptionHandler.java

而我的启动类是位于xuecheng-plus-content/xuecheng-plus-content-api/src/main/java/com/xuecheng/content/ContentApplication.java

很明显这时的启动类只能扫描到content及以内的,如果我需要扫描到配置,需要将启动类修改为

xuecheng-plus-content/xuecheng-plus-content-api/src/main/java/com/xuecheng/ContentApplication.java

或者在启动类中添加扫描

@SpringBootApplication(scanBasePackages = "com.xuecheng"

这里为什么不在一个模块内也会被扫描到?
其实关于学成在线这一块是比较绕的,我经过梳理发现:api模块是依赖model模块的,而model模块又依赖base模块。因此api模块也是依赖basebase模块。而大家的包都是com.xuecheng,因此可以被扫描到
posted @ 2024-06-23 22:45  天启A  阅读(53)  评论(0)    收藏  举报