SpringBoot的全局异常处理类不生效
# 前言
今天我把Springboot多模块的全局统一异常处理抽出来,放到common模块。但是发现无论如何我的全局异常处理都没有生效。
如退所示,我的模块如下
当我ware模块下的service方法中有一个抛出异常,但是却没有被common模块中的拦截器拦截到。
elitemall-common/src/main/java/com/elite/mall/common/exception
package com.elite.mall.common.exception;
import com.elite.mall.common.api.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 全局统一处理所有异常
*
* @author SaulJ
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(value = ApiException.class)
public CommonResult handle(ApiException e) {
System.out.println("捕捉到了API异常……");
if (e.getErrorCode() != null) {
return CommonResult.failed(e.getErrorCode());
}
return CommonResult.failed(e.getMessage());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
我在postman故意去发送错误的数据,让它抛出异常,发现并没有捕捉到,控制台也不打印这句话。
# 原因
经过我排查,因为Springboot没有扫描到另一个模块中的异常处理类,所以需要添加扫描范围。
# 解决
@SpringBootApplication(scanBasePackages = "com.elite.mall")
1
只需要在ware的Springboot启动类中加入扫描范围即可,因为我所有的包都是在这个com.elite.mall下面的。
通过点击Springboot启动类左边的放大镜,现在可以扫描到了全局异常处理的拦截类。
重启微服务,发现控制台也打印了,前台也按我要的方式返回了。
{
"code": 500,
"message": "只有被领取的采购单才能被完成",
"data": null
}
1
2
3
4
5
2
3
4
5
# 总结
在多模块微服务里,如果类似全局统一处理的类,在common模块,而不是在本服务模块,一定要设置扫描包范围。所有的微服务模块,都在同一个的包下。
# 参考链接
SpringBoot中处理校验逻辑的两种方式,真的很机智! (opens new window)
Spring Boot多模块项目中,解决全局异常捕获不生效的问题_LLittleF的博客-CSDN博客 (opens new window)
mall/MallPortalApplication.java at master · macrozheng/mall (opens new window)
帮我改善此页面 (opens new window)
上次更新: 2021/02/16, 12:29:08