标题# Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException Annotation 报错解决
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException Annotation 报错解决
springboot项目启动报错
前言
以下是本次报错的处理历程,如果你的项目也是在启动时报类名重复,希望我的处理方法对你有用。
报错信息如下
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'shiroConfig' for bean class [cn.com.compass.web.hanlder.BaseExceptionHandle] conflicts with existing, non-compatible bean definition of same name and class [cn.com.compass.core.hanlder.BaseExceptionHandle]
原因:我的项目中有使用开源项目:compass,我的项目依赖树告诉我项目A依赖项目B,项目B依赖compass,项目通过Jenkins打包部署后就报这个错,其实项目中是没有使用到core这个包的。
首先,我先想到的就是而我在pom文件中对项目B的dependency添加排除compass的依赖但是不知道为什么不生效;
其次,我使用maven-shade-plugin插件对这个类进行单独排除,各种尝试各种查资料,结果项目启动各种报错;
最后我才使用@ComponentScan注解去排除这个类,使用方式如下:
@ComponentScan(basePackages={"cn.com.compass.core"},
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = {"cn.com.compass.core.handler.BaseExceptionHandler"}))
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@ComponentScan注解介绍
1、@ComponentScan注解的作用
@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定义包扫描的规则,然后根据定义的规则找出哪些需类需要自动装配到spring的bean容器中,然后交由spring进行统一管理。
说明:针对标注了@Controller、@Service、@Repository、@Component 的类都可以别spring扫描到。
2、@ComponentScan注解属性介绍
2.1 value
指定要扫描的包路径
2.2 excludeFilters(排除规则)
excludeFilters=Filter[] 指定包扫描的时候根据规则指定要排除的组件
2.3 includeFilters(包含规则)
includeFilters =Filter[] 指定包扫描的时候根据规则指定要包含的组件.
注意:要设置useDefaultFilters = false(系统默认为true,需要手动设置) includeFilters包含过滤规则才会生效。
2.4 FilterType属性
FilterType.ANNOTATION:按照注解过滤
FilterType.ASSIGNABLE_TYPE:按照给定的类型,指定具体的类,子类也会被扫描到
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:正则
FilterType.CUSTOM:自定义规则
useDefaultFilters: 配置是否开启可以对加@Component,@Repository,@Service,@Controller注解的类进行检测, 针对Java8 语法可以指定多个@ComponentScan,Java8以下可以用 @ComponentScans() 配置多个规则
结束语
以上是本次报错的处理历程,如果你的项目也是在启动时报类名重复,希望我的处理方法对你有用。