无法实例化Spring bean存储库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法实例化Spring bean存储库相关的知识,希望对你有一定的参考价值。

在此任务中,我不允许使用自动布线

所以我试图创造类似的东西:https://www.tutorialspoint.com/spring/spring_java_based_configuration.htm

我的代码

@Configuration
public class ApplicationConfig {

    @Bean
    public FoodService foodService() {
        return new FoodService(FoodRepository());
    }

    @Bean
    public FoodRepository foodRepository() {
        return new FoodRepository();
    }
}

当然,由于FoodRepository是一个扩展MongoRepository的接口,它给出了一个错误,它没有被实例化,并且在服务中我确实需要调用存储库来保存等等。怎么解决这个?

答案

我在Spring Data MongoDB documentation找到了答案

在ApplicationConfig.java里面我应该做了以下事情:

@Configuration
@EnableMongoRepositories("com.food.repository")
public class ApplicationConfig {
@Value("${spring.data.mongodb.host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDB;

@Bean
public foodService foodService() {
    MongoOperations operations = new MongoTemplate(new MongoClient(mongoHost,mongoPort), mongoDB);
    MongoRepositoryFactory factory = new MongoRepositoryFactory(operations);
    foodRepository foodRepository = factory.getRepository(foodRepository.class);
    return new foodService(foodRepository);
}
另一答案

更新了线路

既然你没有用Spring Boot标记问题,我会假设你使用的是香草Spring

根据https://docs.spring.io/spring-data/mongodb/docs/1.2.0.RELEASE/reference/html/mongo.repositories.html,你需要:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:mongo="http://www.springframework.org/schema/data/mongo"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/data/mongo
    http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd">

  <mongo:mongo id="mongo" />

  <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongo" />
    <constructor-arg value="databaseName" />
  </bean>

  <mongo:repositories base-package="com.acme.*.repositories" />

</beans>

我建议创建一个类似的文件,并在@Import中包含引用.xml文件的ApplicationConfig

如果你没有在FoodRepository接口上添加额外的方法,就没有必要实现它,因此你不能做new FoodRepository()


更新:

由于这是一个Spring Boot应用程序,您只需要:

添加对pom.xml的依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

使用@Configuration注释主类(或@EnableMongoRepositories-annotated class)

配置属性:

spring.data.mongodb.host=
spring.data.mongodb.port=
spring.data.mongodb.database=

以上是关于无法实例化Spring bean存储库的主要内容,如果未能解决你的问题,请参考以下文章

使用 DNS 记录(SRV 和 TXT)时,无法在 Spring 上下文中实例化 Mongo 相关 bean

看看Spring的源码——bean实例化

学习使用Spring实例化Bean

Spring 实例化bean的三种方式

Spring源码分析非懒加载的Bean实例化过程(下篇)

无法实例化 Pageable bean