【问题标题】:SpringBoot CRUD Repository fail to AutowireSpring Boot CRUD 存储库无法自动装配
【发布时间】:2017-03-28 21:04:57
【问题描述】:

我正在使用 SpringBoot 和 JPA。我收到一个无法完成的@Autowired 错误。

这是我的主要课程:

package com;

@SpringBootApplication
@EnableJpaRepositories(basePackages="com.repository")
public class InitBatch implements CommandLineRunner {

    @Autowired
    private Batch batch;

    @Autowired
    private CareDao careDAO;


    @Override
    public void run(String... args) throws Exception {
        careDAO.setMessageSource(messageSource());      
        batch.processFiles();   
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(InitBatch.class, args).close();
        System.out.println("Finish");
    }


    @Bean
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

        messageSource.setBasename("file:/config/instances");
        messageSource.setCacheSeconds(100);
        return messageSource;
    }   
}

这是我失败的课程:

package com.logger.impl;

@Configuration
@ComponentScan({"com.repository"})

@Component
public class RequestLoggerImpl implements RequestLogger {

    @Autowired
    private RequestLogDao requestLogDao;

}

这是RequestLogDao 类:

package com.repository;
public interface RequestLogDao extends CrudRepository<RequestLog, Integer> {

}

这是错误信息:

创建名为“requestLoggerImpl”的 bean 时出错:注入自动装配的依赖项失败;

无法自动装配字段:private com.repository.RequestLogDao com.logger.impl.RequestLoggerImpl.requestLogDao;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [com.repository.RequestLogDao] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

我只是不知道为什么它不能自动接线。我曾尝试在我的主课中添加@EnableJpaRepositories,但这不起作用。有什么建议?提前致谢!

【问题讨论】:

  • 首先,您不应该将您的RequestLoggerImpl 注释为@Configuration——它是一个服务bean,而不是一个配置类。

标签: java spring spring-boot spring-data-jpa


【解决方案1】:

你有实现RequestLogDao 的具体类吗?我没有看到。

您需要有一个(Java 类),并且需要在应用程序上下文中提供它的一个实例。

【讨论】:

  • 他使用的是Spring Data JPA,所以不需要实现。
  • 我在他的问题中包含的代码中看不到任何会导致实现RequestLogDao 的活动对象出现在应用程序上下文中的内容。
【解决方案2】:

删除两个

@Configuration
@ComponentScan({"com.repository"}) 

来自 RequestLoggerImpl

并从主类中删除 @EnableJpaRepositories(basePackages="com.repository")。并将主类移动到com包的正下方

我假设,您添加了 spring-boot-starter-data-jpa 依赖项

【讨论】:

    【解决方案3】:

    对于您的请求记录器,请先删除配置和组件扫描

    package com.logger.impl;
    
    @Component
    public class RequestLoggerImpl implements RequestLogger {
    
        @Autowired
        private RequestLogDao requestLogDao;
    
    }
    

    既然你已经放置了一个@Configuration,我假设你需要一个配置类,所以你可以像这样创建一个:

    @Configuration
    @EnableJpaRepositories(basePackages = {"com.repository"}
    public class MyConfiguration {
        // possibly your Bean declarations here
        // like dataSource, transactionManager etc.. related to your jpa repo
        // as needed
    }
    

    在此处记下您的基本包;因为它将用于:

    package com.repository;
    
    @Repository
    public interface RequestLogDao extends CrudRepository<RequestLog, Integer> {
        // ...
    }
    

    终于进入你的主班

    @SpringBootApplication // scan base packages for autowiring as needed
    public class InitBatch implements CommandLineRunner {
        // ...
    }
    

    最后检查你的依赖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2017-05-23
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      相关资源
      最近更新 更多