提问者:小点点

组织Spring框架清洁工厂。UnsatisfiedDependencyException:创建名为“demoRestController”的bean时出错


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

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发挥作用:

  1. @Autowired 登录Bean loginBean;
  2. 在控制器类中创建 LoginBean 的 getter setter 和自动连线的 setter;
  3. 创建控制器的构造函数并自动连线,如上面的代码所示;

下面是我得到的错误

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

共3个答案

匿名用户

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

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

  1. LoginBean 移动到 com.ag.digital.demo.boot 或子包中。
  2. 使用应在演示应用程序@SpringBootApplicationscanBasePackages 属性配置扫描组件的包。

其他一些不会引起问题,但与您发布的代码不太合适的事情:

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

匿名用户

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

匿名用户

在我的例子中,这是在我的单元测试中出现的错误,显然,我不仅要在主类上添加新的包,还要在测试配置类上添加新的包,在特定于测试类的ComponentScan注释中,我刚刚添加了

com.bpg.csp.cbs.common.util

因为这是我在项目中添加的新包。下面是我的完整测试配置代码片段

@Profile("junit")
@Configuration
@ComponentScan(basePackages = {
        "com.bpg.services.booking.gds.adapter.impl.config",
        "com.bpg.csp.cbs.common.util"
})
public class TestConfiguration
{
}