Java 无法自动装配字段 spring-boot

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24645853/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 13:41:50  来源:igfitidea点击:

could not autowire field spring-boot

javaspringspring-mvcspring-bootspring-tool-suite

提问by Ricardo Garza V.

Need some help, I am just starting to learn Spring and can't seem to figure out what us wrong:

需要一些帮助,我刚刚开始学习 Spring,似乎无法弄清楚我们错在哪里:

Application.java - no package

Application.java - 没有包

@Configuration
//@ComponentScan({"com.mapping","com.accesors","com.controllers"}) --Originaly tried this
@ComponentScan(basePackageClasses={UserDAO.class,Root.class,User.class})
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

User.java - package com.mapping

User.java - 包 com.mapping

@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;
    private String userName;
    private String password;
    //accesors
}

UserDAO.java - package com.accesors

UserDAO.java - 包 com.accesors

@Repository
public interface UserDAO extends JpaRepository<User, Long> {

}

Root.java - package com.controllers

Root.java - 包 com.controllers

@Controller
@RequestMapping("/*")
public class Root {

    @Autowired
    UserDAO userDAO;

    @RequestMapping("/")
    @ResponseBody
    public String rootAction(@RequestParam(defaultValue="foo") String name){
        List<User> lst = this.userDAO.findAll();
        for(User u : lst){
            System.out.println(u);
        }
        return "hello, " + name;
    }

}

And I seem to get the following exeption when I run the project

当我运行项目时,我似乎得到了以下例外

Stacktrace:

堆栈跟踪:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'root': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.accesors.UserDAO com.controllers.Root.userDAO; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.accesors.UserDAO] 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)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
    at demo.Application.main(Application.java:14)

From what I understand it means that @ComponentScan is not detecting the packages

据我了解,这意味着 @ComponentScan 没有检测到包

采纳答案by Dave Syer

If your Spring Data repositories are not in a sub-package of the @EnableAutoConfigurationclass then you need to add @EnableJpaRepositories(and ditto for @EntityScanif the entities are not in a sub-package).

如果您的 Spring Data 存储库不在@EnableAutoConfiguration类的子包中,那么您需要添加@EnableJpaRepositories@EntityScan如果实体不在子包中,也是如此)。

回答by Antonio Martin

If you are testingyour springboot app with springRunner don't forget to include the ComponentScan annotation.

如果您正在使用 springRunner测试您的 springboot 应用程序,请不要忘记包含 ComponentScan 注释。

@RunWith(SpringRunner.class)    
@SpringBootTest (classes = YourRestController.class )    
@ComponentScan({"your package goes here"})    
@AutoConfigureMockMvc    
@ActiveProfiles("development")    
public class Foo{
}