我有以下Spring Repository:
import com.azure.spring.data.cosmos.repository.CosmosRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PersonRepository extends CosmosRepository<Person, String> {}
在我的service类的构造函数中引用如下:
private final PersonRepository personRepository ;
@Autowired
public PersonService(
PersonRepository personRepository) {
this.personRepository= personRepository;
}
我已经在我的pom中添加了这个依赖:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-spring-data-cosmos</artifactId>
<version>3.34.0</version>
</dependency>
这是我的应用程序入门类:
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@EnableSwagger2
@ConfigurationPropertiesScan("com.example.person")
public class PersonApplication extends SpringBootServletInitializer {
我得到的错误是:
Parameter 3 of constructor in PersonService required a bean of type 'PersonRepository' that could not be found.
Action:
Consider defining a bean of type 'PersonRepository' in your configuration.
这里的问题是什么?为了在Spring boot
应用程序中使用CosmosRepository
,我是否缺少了另一个必要的dependency
?
编辑:当我添加@EnableCosmosRepositories时,我得到以下内容:The bean 'personRepository', defined in "com.example.PersonRepository defined in @EnableCosmosRepositories declared on CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration, could not be registered. A bean with that name has already been defined in com.example.PersonRepository defined in @EnableCosmosRepositories declared on PersonApplication and overriding is disabled."
3条答案
按热度按时间xqk2d5yq1#
为了扩展评论内容,“Azure Spring Data Cosmos客户端库用于Java /自定义配置”部分确实提到:
默认情况下,
@EnableCosmosRepositories
将扫描当前包中扩展Spring Data存储库接口之一的任何接口。如果您的项目布局有多个项目,则使用它来注解Configuration类,以便按
@EnableCosmosRepositories(basePackageClass=UserRepository.class)
扫描不同的根包。含义:如果您的存储库类不在主应用程序类的同一个包或子包中,请使用
@EnableCosmosRepositories(basePackageClasses = PersonRepository.class)
指定包含您的存储库类的包。在您的情况下,请尝试:
如果您的
PersonRepository
在com.example.person.repository
包中定义,则@EnableCosmosRepositories(basePackageClasses = PersonRepository.class)
annotation将告诉Sping Boot 扫描com.example.person.repository
包以查找任何扩展Spring Data Cosmos DB存储库接口的接口。OP补充说:
当我添加
@EnableCosmosRepositories
时,我得到以下结果:无法注册在
CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration
上声明的“com.example.PersonRepository
defined in@EnableCosmosRepositories
declared inCosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration
”中定义的Bean“personRepository
”。在
PersonApplication
上声明的@EnableCosmosRepositories
中定义的com.example.PersonRepository
中已经定义了具有该名称的bean,并且禁用了覆盖。因此,两个同名的bean之间存在冲突,
personRepository
:检查配置中是否有多个@EnableCosmosRepositories
声明。如果这样做了,请尝试从
PersonApplication
类中删除@EnableCosmosRepositories
注解,因为CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration
类似乎已经有了该注解。相反,应重点更新
CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration
类,以包含包含PersonRepository的包。但是:如果您没有访问
CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration
类的权限,您可以尝试从Sping Boot 自动配置中排除CosmosDbRepositoriesAutoConfiguration
类,这可能会解决冲突。这应该会禁用
CosmosDbRepositoriesAutoConfiguration
类的自动配置,只保留自定义的@EnableCosmosRepositories
注解。并且,正如评论的那样,确保像使用
azure-spring-data-cosmos
一样使用3.x version ofazure-spring-boot
:(因为
azure-spring-boot
在其“编译依赖项”中有azure-spring-data-cosmos
(可选)3.34.0)ncecgwcz2#
我认为您的代码使用的库中可能存在某种错误配置。
你没有提到你在问题中使用的Sping Boot 版本,而是处理Microsoft Azure Java库,这是一个非常相关的信息:他们将其库的绝大多数的命名空间和相关功能从形式为
com.microsoft.azure
的包中的那些更改为在com.azure
命名空间中的那些,统一在存储库azure-sdk-for-java中。此外,在Azure Cosmos DB的特定情况下,请考虑查看Azure Spring Data Cosmos客户端库和所需Sping Boot 版本之间的对应表:如果你使用的是
3.34.0
版本,你应该使用Sping Boot2.7.x
。但奇怪的是,在你的注解中提到了
com.microsoft.azure.spring.data.cosmosdb.repository.support.CosmosRepositoryFactoryBean
,这意味着在你的代码或Maven配置中的某些地方,你使用的是old Microsoft Spring Data Cosmos library,而不是new one defined in the Azure SDK for Java。在您的问题中,您也提到了
CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration
的使用;正如@devatherock的评论中所述,这意味着您正在使用旧版本的Azure Spring Boot library:这可能解释了使用旧的Azure Spring Data Cosmos Library的问题,也许你正在使用某种启动器等。请考虑检查您的依赖项并搜索上述库,特别是Azure Spring Data for Cosmos,并确保包含正确的库:它可能会使您代码正常工作。
如果你愿意,你可以继续使用Sping Boot 2.3.x并使用old version of the Azure Spring Data for Cosmos library,基本上你需要做的就是将azure-cosmosdb-spring-boot-starter作为你的依赖项之一,并配置属性来访问Cosmos DB。
话虽如此,如果可能的话,尝试使用新版本的库:Azure SDK for Java提供了an example的必要configuration,如Microsoft文档中所述。
bxjv4tth3#
在同一个包
com.example
中,似乎还有另一个名为HierarchyRepository
的类,它正在注册另一个同名的存储库(personRepository
)。可能这只是一个你想用于普通层次结构的接口,在这种情况下,它不应该被注册为springbean。
这个问题的解决方案是继续让您的
HierarchyRepository
在同一个扫描的包中,进入这个类(HierarchyRepository
)并使用注解@NoRepositoryBean
。这样你就可以在你的代码中使用它,但是它不能注册为bean,所以它不会与你需要的另一个从@EnableCosmosRepositories
创建的bean冲突。