SpringBoot项目启动报错解决记录
2020-06-29 11:14:37,181 - [WARN] o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'xxTmpRepository' defined in null: Cannot register bean definition [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'xxTmpRepository': There is already [Root bean: class [org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
2020-06-29 11:14:37,196 - [ERROR] o.s.b.d.LoggingFailureAnalysisReporter -
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'xxTmpRepository', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
上面是启动报错的日志输出,总之就是说有一个类声明已经存在了,你又没说可以覆盖,所以我就报错咯。
解决方案有两个:
1. 像上面说的那个,给配置文件添加一个 spring.main.allow-bean-definition-overriding=true 就可以了。
2. 找到为啥会重复,然后把重复的去掉。
上面的日志输出已经说了是 BeanDefinitionOverrideException 抛出来的 JpaRepositoryFactoryBean 与 JdbcRepositoryFactoryBean 冲突,也就是说这两个 BeanFactory 都尝试把 xxTmpRepository 进行处理,后面处理的那个就报错了。
不让后面那处理就可以了,我这里这个 xxTmpRepository 是 JPA的 repository,按理说 jdbcRepository 不应该去管这个,谁知道咋回事儿呢?反正就是 jdbc越权了,需要限制一下下。
安排!把 xxTmpRepository 所在的目录不让 jdbcRepository 扫描到。
@EnableJdbcRepositories(excludeFilters = { @ComponentScan.Filter( type = FilterType.ASPECTJ, pattern = "com.xx.xxx.repotory.*") })
把这个加到主启动类上就可以了。
完结。