java 构造函数的参数需要的bean类型找不到?

gstyhher  于 2023-05-12  发布在  Java
关注(0)|答案(3)|浏览(201)

我有以下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."

xqk2d5yq

xqk2d5yq1#

为了扩展评论内容,“Azure Spring Data Cosmos客户端库用于Java /自定义配置”部分确实提到:
默认情况下,@EnableCosmosRepositories将扫描当前包中扩展Spring Data存储库接口之一的任何接口。
如果您的项目布局有多个项目,则使用它来注解Configuration类,以便按@EnableCosmosRepositories(basePackageClass=UserRepository.class)扫描不同的根包。
含义:如果您的存储库类不在主应用程序类的同一个包或子包中,请使用@EnableCosmosRepositories(basePackageClasses = PersonRepository.class)指定包含您的存储库类的包。
在您的情况下,请尝试:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@EnableSwagger2
@ConfigurationPropertiesScan("com.example.person")
@EnableCosmosRepositories(basePackageClasses = PersonRepository.class)
public class PersonApplication extends SpringBootServletInitializer {
    // ...
}

如果您的PersonRepositorycom.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 in CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration”中定义的Bean“personRepository”。
PersonApplication上声明的@EnableCosmosRepositories中定义的com.example.PersonRepository中已经定义了具有该名称的bean,并且禁用了覆盖。
因此,两个同名的bean之间存在冲突,personRepository:检查配置中是否有多个@EnableCosmosRepositories声明。
如果这样做了,请尝试从PersonApplication类中删除@EnableCosmosRepositories注解,因为CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration类似乎已经有了该注解。
相反,应重点更新CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration类,以包含包含PersonRepository的包。
但是:如果您没有访问CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration类的权限,您可以尝试从Sping Boot 自动配置中排除CosmosDbRepositoriesAutoConfiguration类,这可能会解决冲突。

@SpringBootApplication(
        exclude = {
                MongoAutoConfiguration.class,
                MongoDataAutoConfiguration.class,
                CosmosDbRepositoriesAutoConfiguration.class
        }
)
@EnableSwagger2
@ConfigurationPropertiesScan("com.example.person")
@EnableCosmosRepositories(basePackageClasses = PersonRepository.class)
public class PersonApplication extends SpringBootServletInitializer {
    // ...
}

这应该会禁用CosmosDbRepositoriesAutoConfiguration类的自动配置,只保留自定义的@EnableCosmosRepositories注解。
并且,正如评论的那样,确保像使用azure-spring-data-cosmos一样使用3.x version of azure-spring-boot

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>azure-spring-boot</artifactId>
    <version>3.14.0</version>
</dependency>

(因为azure-spring-boot在其“编译依赖项”中有azure-spring-data-cosmos(可选)3.34.0)

ncecgwcz

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 Boot 2.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文档中所述。

bxjv4tth

bxjv4tth3#

在同一个包com.example中,似乎还有另一个名为HierarchyRepository的类,它正在注册另一个同名的存储库(personRepository)。
可能这只是一个你想用于普通层次结构的接口,在这种情况下,它不应该被注册为springbean。
这个问题的解决方案是继续让您的HierarchyRepository在同一个扫描的包中,进入这个类(HierarchyRepository)并使用注解@NoRepositoryBean。这样你就可以在你的代码中使用它,但是它不能注册为bean,所以它不会与你需要的另一个从@EnableCosmosRepositories创建的bean冲突。

相关问题