构造函数的参数需要一个无法找到的类型的 bean?

jav*_*900 5 java spring maven spring-data azure-cosmosdb

我有以下Spring 存储库

import com.azure.spring.data.cosmos.repository.CosmosRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PersonRepository extends CosmosRepository<Person, String> {}
Run Code Online (Sandbox Code Playgroud)

它在我的服务类的构造函数中引用:

private final PersonRepository personRepository ;

@Autowired
    public PersonService(
            PersonRepository personRepository) {
        this.personRepository= personRepository;
    }
Run Code Online (Sandbox Code Playgroud)

我在我的pom中添加了这个依赖项:

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-spring-data-cosmos</artifactId>
  <version>3.34.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序入门课程:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@EnableSwagger2
@ConfigurationPropertiesScan("com.example.person")
public class PersonApplication extends SpringBootServletInitializer {
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

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.
Run Code Online (Sandbox Code Playgroud)

这里有什么问题呢?dependency为了CosmosRepository在我的应用程序中使用它,我是否缺少另一个必需的内容Spring boot

编辑:当我添加 @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."

Von*_*onC 3

为了扩展评论内容,“适用于 Java 的 Azure Spring Data Cosmos 客户端库/自定义配置”部分确实提到了:

默认情况下,@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 {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您PersonRepository在 package 中定义com.example.person.repository,则@EnableCosmosRepositories(basePackageClasses = PersonRepository.class)注释将告诉 Spring Boot 扫描com.example.person.repository包中是否有任何扩展 Spring Data Cosmos DB 存储库接口的接口。


OP 补充道:

当我添加 时@EnableCosmosRepositories,我得到以下信息:

无法注册personRepository在“在声明中com.example.PersonRepository定义”中定义的bean“ ”。 具有该名称的 bean 已在在声明中定义中定义,并且覆盖被禁用。@EnableCosmosRepositoriesCosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration
com.example.PersonRepository@EnableCosmosRepositoriesPersonApplication

因此,两个同名的 bean 之间存在冲突:检查配置中personRepository是否有多个声明。@EnableCosmosRepositories

如果这样做,请尝试@EnableCosmosRepositoriesPersonApplication类中删除注释,因为该类CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration似乎已经具有注释。
相反,集中精力更新CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration类以包含包含 PersonRepository 的包。

但是:如果您无权访问该类CosmosDbRepositoriesAutoConfigureRegistrar.EnableCosmosDbRepositoriesConfiguration,您可以尝试CosmosDbRepositoriesAutoConfiguration从 Spring Boot 自动配置中排除该类,这可能会解决冲突。

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

这应该禁用类的自动配置CosmosDbRepositoriesAutoConfiguration,只保留您的自定义@EnableCosmosRepositories注释。


并且,正如所评论的,请确保使用3.x 版本,azure-spring-boot就像您所做的那样azure-spring-data-cosmos

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>azure-spring-boot</artifactId>
    <version>3.14.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

(自azure-spring-boot其“编译依赖项” azure-spring-data-cosmos(可选)3.34.0 起)