Java org.springframework.beans.factory.unsatifiedDependencyException:创建名为';demoRestController';

Java org.springframework.beans.factory.unsatifiedDependencyException:创建名为';demoRestController';,java,dependency-injection,spring-boot,Java,Dependency Injection,Spring Boot,我是Spring的新手,我正在尝试制作一个学习应用程序,但我在自动布线方面遇到了问题,我正在添加代码。我正在做弹簧靴 弹簧启动代码 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } LoginBean.java @Service @Component pub

我是Spring的新手,我正在尝试制作一个学习应用程序,但我在自动布线方面遇到了问题,我正在添加代码。我正在做弹簧靴

弹簧启动代码

public class DemoApplication {

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

@Service
@Component
public class LoginBean {
    private String userId;
    private String pwd;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
DemoRestController.java

@RestController
@EnableAutoConfiguration
@RequestMapping("/demo")
@Component
public class DemoRestController {


    private final LoginBean loginBean;

    @Autowired
    public DemoRestController(LoginBean loginBean) {
        this.loginBean=loginBean;
    }

    @RequestMapping(value = "/login/{id},{pwd}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody LoginBean loginService(@PathVariable String id, @PathVariable String pwd) {
        //LoginBean loginBean = new LoginBean();

        loginBean.setUserId(id);
        loginBean.setPwd(pwd);
        return loginBean;
    }
我尝试了以下场景以使@Autowired正常工作:

  • @自动连接到LoginBean LoginBean
  • 在控制器类和自动连线设置器中创建LoginBean的getter设置器
  • 创建控制器和自动连线的构造函数,如上述代码所示 下面是我得到的错误

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demoRestController': Unsatisfied dependency expressed through constructor argument with index 0 of type [com.ag.digital.demo.bean.LoginBean]: No qualifying bean of type [com.ag.digital.demo.bean.LoginBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.ag.digital.demo.bean.LoginBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at com.ag.digital.demo.boot.DemoApplication.main(DemoApplication.java:14) [classes/:na]
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.ag.digital.demo.bean.LoginBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        ... 19 common frames omitted
    

    您的
    DemoApplication
    类位于
    com.ag.digital.demo.boot
    包中,您的
    LoginBean
    类位于
    com.ag.digital.demo.bean
    包中。默认情况下,如果组件(用
    @Component
    注释的类)位于主应用程序类
    DemoApplication
    的相同包或子包中,则会找到这些组件。这意味着找不到
    LoginBean
    ,因此依赖项注入失败

    有几种方法可以解决您的问题:

  • LoginBean
    移动到
    com.ag.digital.demo.boot
    或子包中
  • 使用
    @SpringBootApplication
    scanBasePackages
    属性配置扫描组件的软件包,该属性应位于
    DemoApplication
  • 其他一些不会引起问题,但与您发布的代码不完全一致的事情:

    • @服务
      @组件的专业化
      ,因此您不需要在
      LoginBean
    • 类似地,
      @RestController
      @组件的专业化
      ,因此在
      DemoRestController
    • DemoRestController
      对于
      @EnableAutoConfiguration
      来说是一个不同寻常的地方。该注释通常直接或通过
      @SpringBootApplication
      在主应用程序类(
      DemoApplication
      )上找到,后者是
      @ComponentScan
      @Configuration
      @EnableAutoConfiguration
      的组合

    对我来说,它发生在
    DogController
    自动连线
    DogService
    自动连线
    DogRepository
    Dog
    类以前有字段
    name
    ,但我将其更改为
    coolName
    ,但没有更改
    DogRepository
    中的方法:
    Dog findDogByName(字符串名称)
    。我将该方法更改为
    Dog findDogByCoolName(字符串名)
    ,现在它可以工作了。

    您好,我已经解决了我的问题@安迪非常感谢你的宝贵回复。很抱歉,我也应该提供SpringBoot的应用程序类。实际上,主要问题是Spring Boot的应用程序类。我提供代码。公共类DemoApplication{public static void main(String[]args){SpringApplication.run(DemoApplication.class,args);}}类名和参数类名应该相同,这是我的实际问题。什么是参数类名谢谢!第一点对我来说节省了很多时间:-)