• Spring Boot @Autowired 没法自动注入的问题


    Application 启动类:

    @SpringBootApplication
    @EnableConfigurationProperties
    @ComponentScan(basePackages = { "com.testing"})
    public class Application {
       @Bean
       RestTemplate restTemplate() {
          return new RestTemplate();}
       public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
          System.out.println("成功启动");
       }

    Dao层:

    public interface UserRepository extends JpaRepository<User, String>{
        User findByUsername(String username);   //
    }
    Service 层:注入一个继承了JPA 的接口,理论上spring boot 会把JPA 注入repository,该接口是一定不需要实现类的.
    上述方法实现了按Username查询User实体,可以看到我们这里没有任何类SQL语句就完成了个条件查询方法。
    这就是Spring-data-jpa的一大特性:通过解析方法名创建查询
    
    
    
    @Service
    public class DataInit {
    
        @Autowired
        UserRepository userRepository;
    }
    

    但是会提示错误:提示@Autowired 不能正常注入:

    可正常编译,没法运行,gradle bootrun 时提示错误:

    caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.testing.data.UserRepository com.testing.service.DataInit.userRepository; nested exception is org.spring
    framework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.testing.data.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate
    for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=userRepository)}

    Execution failed for task ':bootRun'.
    > Process 'command 'C:Program Files (x86)Javajdk1.8.0_101injava.exe'' finished with non-zero exit value 1

    总结:

    出现该类错误时,可有一下几个问题需要去检查:

    1. 检查各类是否加了注解,包括@service,@repository 等等;(注意@Autowired放在service实现上,而不是接口类上面。)

    2. 包是否正确扫描到,这个很重要!!!(我的问题就是因为这个)

    注意:http://bbs.csdn.net/topics/391978111?page=1#post-401966615 (#5)

    SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!

    “Application类”是指SpringBoot项目入口类。这个类的位置很关键:
    如果Application类所在的包为:com.boot.app,则只会扫描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,则不会被扫描!
    即, 把Application类放到dao、service所在包的上级,com.boot.Application

    知道这一点非常关键,不知道spring文档里有没有给出说明,如果不知道还真是无从解决.

  • 相关阅读:
    SAP 移动类型 整理
    VB6及VS2005 相关的 树TREE控件,网格控件、电子表格控件、网络图及甘持图控件(项目进度)
    金蝶 PK 用友,第三方评论与自我评价(1)
    谁在开发“工作流”WORKFLOW 产品?
    协同及ERP开发平台,我们如何选择?
    关注“北京广联达软件公司”的项目成本管理系统 !
    一个免费提供的开发平台___"KCOM 商业工程"
    企业 ISO“质量、安全和环境” 三大体系认证的管理系统的开发者 !
    MAXWELL 万胜系统软件公司——为工程建设承包商提供优秀的软件套件!
    Contractor Anywhere (任何地方的承包商)也被 SAGE “赛捷”公司收购 !
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/8960974.html
Copyright © 2020-2023  润新知