- 一、前言
- 二、排查过程
- @Controller的用法
- @ExceptionHandler的用法
- 问题所在
- 附:SpringBoot注解扫描范围约定
- 附:罗列spring容器中所有的bean
- 三、解决
- 1、指定扫描范围
- 1、移动启动类的位置
- 总结
- 仍未解决问题
多模块项目,项目结构如图,父模块引入了spring-boot依赖
其中common模块下有一个用@ControllerAdvice和@ExceptionHandler注解实现的全局异常处理器(以下简称:处理器)
并在user模块中创建了controller层,在user模块的pom中引入了common模块的依赖,期望通过这个处理器捕捉此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 Boot加载的所有bean
三、解决 1、指定扫描范围启动类中@SpringBootApplication注解有scanBasePackages和scanBasePackageClasses元素,可以指定扫描的包和类
1、移动启动类的位置移动启动类的位置使处理器位于启动类的同级或者子包下
移动启动类之后有可能会报找不到启动类的错误,可以在pom中设置一下
总结org.springframework.boot spring-boot-maven-plugin pri.vigoss.cloud.mall.practice.UserApplication
1、对于springboot的机制了解不够
2、对于maven多模块项目的依赖机制了解不够
此异常处理器的具体生效范围



