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"标签:java,xuecheng,spring,content,模块,抛出,注解,异常,public From: https://www.cnblogs.com/kun1790051360/p/18264056
这里为什么不在一个模块内也会被扫描到?
其实关于学成在线这一块是比较绕的,我经过梳理发现:api模块是依赖model模块的,而model模块又依赖base模块。因此api模块也是依赖basebase模块。而大家的包都是com.xuecheng,因此可以被扫描到