我试图在我的SpringBoot存储库中实现自定义功能,方法是按照这里的说明创建一个新的基本存储库类并将其添加到@EnableJpaRepositories
注释中。但是,当我这样做时,我得到以下错误:
异常堆栈
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'myRepository' defined in com.my.service.repository.MyRepository defined in @EnableJpaRepositories declared on UpperLevelJpaConfig: Cannot register bean definition [Root bean: class [com.my.data.entity.base.BaseRepositoryFactoryBean]; scope=; abstract=false; lazyInit=true; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in com.my.service.repository.MyRepository defined in @EnableJpaRepositories declared on UpperLevelJpaConfig] for bean 'myRepository': There is already [Root bean: class [com.my.service.repository.BaseRepositoryFactoryBean2]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in com.my.service.repository.MyRepository defined in @EnableJpaRepositories declared on MyServiceApplication] bound.
看完这个关于Exception类型的教程后,我想我明白了它试图创建两次存储库——一次来自我的注释,一次来自另一个注释。
有办法绕过这个吗?我不能更改配置文件或它如何应用于我的服务,因为它来自于项目结构的高层。
提前感谢!
编辑添加更多代码:
My service class:
@SpringBootApplication
@RefreshScope
@EnableConfigurationProperties
@EnableDiscoveryClient
@EnableTransactionManagement
@EnableJpaRepositories(repositoryFactoryBeanClass = BaseRepositoryFactoryBean2.class)
@ComponentScan(
basePackages = {
"com.my.service",
})
public class MyServiceApplication {
}
upperleveljpacconfig类:
@Configuration
@EnableConfigurationProperties(value = {PoolDataSourceConfig.class, JpaProperties.class})
@EnableTransactionManagement
@EnableJpaRepositories(
bootstrapMode = BootstrapMode.LAZY,
basePackages = "${jpa.repositoryPackagePath:null}",
repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class)
public class UpperLevelJpaConfig{
}
我明白了。
我没有配置所有的存储库来使用我的BaseRepositoryImpl,我意识到我只需要一个。
我能够以独立的方法创建存储库,而不是使用标准的JavaConfig或XmlConfiguration。我从我的应用程序类中删除了@EnableJpaRepositories
,而是在我的服务impl类中做了以下操作:
public class EventServiceImpl implements EventService {
private EventRepository eventRepository;
@Autowired private EntityManager entityManager;
@PostConstruct // because I need the entityManager to be autowired
public void initializeEventRepo() {
RepositoryFactorySupport factory =
new BaseRepositoryFactoryBean2<EventRepository,Event, BigInteger>(
EventRepository.class).createRepositoryFactory(entityManager);
this.eventRepository = factory.getRepository(EventRepository.class);
}
然后我像以前一样使用存储库,但是能够调用我的新方法!