【问题标题】:Can't instantiate Spring bean repository无法实例化 Spring bean 存储库
【发布时间】:2018-08-09 14:51:43
【问题描述】:

在这个任务中我不能使用自动连线

所以我正在尝试创建类似的东西: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 的接口,它会给出一个错误,它没有被实例化,并且肯定在服务内部我需要调用 Repository 来保存等等。如何解决?

【问题讨论】:

  • 你在 FoodRepository 中使用过@Repository 注解吗?
  • 它丢失了,我现在添加了它,但同样的问题仍然无法实例化
  • 你的意思是return new FoodService(foodRepository());
  • 是的,我忘记了 sn-p 中的 (),现在编辑
  • 能否提供stackTrace

标签: spring mongodb spring-boot model-view-controller javabeans


【解决方案1】:

我在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);
}

【讨论】:

    【解决方案2】:

    更新加入行

    由于您没有用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>
    

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

    如果您不向FoodRepository 接口添加其他方法,则无需实现它,因此您无法执行new FoodRepository()


    更新:

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

    添加对pom.xml的依赖:

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

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

    配置属性:

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

    【讨论】:

    • 但是如何在不自动装配的情况下将我的存储库注入到 GeneticsService 中
    • 当使用Spring Boot,一个为您创建和连接bean 的高度自以为是的框架时,您为什么不利用它来发挥自己的优势呢?您认为您的小组复制一半的spring-boot-starter-data-mongodb 现在处理直到MongoTemplate 的所有接线而不是使用... FoodService foodService(@Autowired FoodRepository foodRepository) { 会更好。这里的问题不是布线,而是对工程师缺乏信任或缺乏知识或.....导致I am not allowed to use ...
    • 不管我怎么想,我都在申请,这是他们的偏好。就我个人而言,我会选择自动接线,但也许他们正在测试我的能力,你知道吗?我的意思是,与手动配置整个事情相比,自动装配非常简单。无论如何检查我的答案,我找到了解决方案
    • 我在完成任务后有机会与他们交谈。我的猜测是,他们的生产应用程序在类和依赖项的数量方面很大,并且他们需要一个 Java 类来跟踪哪些类依赖于其他类,因为 Autowired 不会让您有机会跟踪类似的东西,并且他们实际上是在使用这种方式来手动跟踪所有内容。
    • /beans Spring Boot 执行器端点不会提供吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2016-01-08
    • 2018-09-05
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多