文章目录
一、前言
多模块项目,项目结构如图,父模块引入了spring-boot依赖

其中common模块下有一个用@ControllerAdvice和@ExceptionHandler注解实现的全局异常处理器(以下简称:处理器)

并在user模块中创建了controller层,在user模块的pom中引入了common模块的依赖,期望通过这个处理器捕捉此controller层的异常。但是运行发现处理器不起作用。
二、排查过程
@Controller的用法
首先是@ControllerAdvice,生效范围为Controller层(但是我试了一下Service层抛出的异常也会被处理,麻烦懂的大佬赐教),应该没有问题。
@ExceptionHandler的用法
然后是@ExceptionHandler的用法,通常是封装Map放入response直接返回,或者是跳转到指定页面,详情可见统一异常处理@ExceptionHandler的第一部分
问题所在
最后发现springboot扫描并生成bean的范围与启动类的位置有关,我的项目中启动类和处理器在不同的包下,所以这个处理器不会被扫描并放入spring容器中。
附:SpringBoot注解扫描范围约定
SpringBoot项目的注解扫描默认规则是根据Application类所在的包位置从上往下扫描!
“Application类”是指SpringBoot项目入口类。这个类的位置很关键。如果Application类所在的包为:com.iteye.wallimn,则只会扫描com.iteye.wallimn包及其所有子包,如果service或dao所在包不在com.iteye.wallimn及其子包下,则不会被扫描!
如果Application类放在com.iteye.wallimn.app包中,那么与app的同级包、叔叔包是不会被扫描的。
附:罗列spring容器中所有的bean
三、解决
1、指定扫描范围
启动类中@SpringBootApplication注解有scanBasePackages和scanBasePackageClasses元素,可以指定扫描的包和类
1、移动启动类的位置
移动启动类的位置使处理器位于启动类的同级或者子包下
移动启动类之后有可能会报找不到启动类的错误,可以在pom中设置一下
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>pri.vigoss.cloud.mall.practice.UserApplication</mainClass>
</configuration>
</plugin>
总结
1、对于springboot的机制了解不够
2、对于maven多模块项目的依赖机制了解不够
仍未解决问题
此异常处理器的具体生效范围
本文探讨了一个多模块SpringBoot项目中,全局异常处理器失效的问题。问题源于启动类与处理器不在同一扫描范围内。解决方案包括指定扫描范围或调整启动类位置。详细解析了SpringBoot的注解扫描规则,并提供了查看容器中所有bean的方法。
1554

被折叠的 条评论
为什么被折叠?



