问题描述
我是 Spring 的新手,我正在尝试制作一个学习应用程序,但我在自动装配中遇到问题,我正在添加我的代码.我正在研究弹簧靴.
I am new to Spring and I am try to make a application for learning but I am getting problem in Autowiring,I am adding my code. I am working on spring boot.
Spring Boot 代码
Spring Boot Code
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
登录Bean.java
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
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 工作:
I tried following scenarios to make my @Autowired work:
- @Autowired 到 LoginBean loginBean;
- 在 Controller 类中创建了 LoginBean 的 getter setter 和自动装配的 setter;
- 创建控制器的构造函数并自动装配,如上面的代码所示;
下面是我得到的错误
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
包中,您的 DemoApplication
类位于 com.ag.digital.demo.boot
包中code>LoginBean 类位于 com.ag.digital.demo.bean
包中.默认情况下,如果组件(用 @Component
注释的类)位于主应用程序类 DemoApplication
的同一包或子包中,则会找到它们.这意味着没有找到 LoginBean
,因此依赖注入失败.
Your DemoApplication
class is in the com.ag.digital.demo.boot
package and your LoginBean
class is in the com.ag.digital.demo.bean
package. By default components (classes annotated with @Component
) are found if they are in the same package or a sub-package of your main application class DemoApplication
. This means that LoginBean
isn't being found so dependency injection fails.
有几种方法可以解决您的问题:
There are a couple of ways to solve your problem:
- 将
LoginBean
移动到com.ag.digital.demo.boot
或子包中. - 使用
@SpringBootApplication
的scanBasePackages
属性配置扫描组件的包,该属性应该在DemoApplication
上.
- Move
LoginBean
intocom.ag.digital.demo.boot
or a sub-package. - Configure the packages that are scanned for components using the
scanBasePackages
attribute of@SpringBootApplication
that should be onDemoApplication
.
其他一些不会导致问题但与您发布的代码不太正确的事情:
A few of other things that aren't causing a problem, but are not quite right with the code you've posted:
@Service
是@Component
的特化,所以你不需要LoginBean
- 同样,
@RestController
是@Component
的特化,所以你不需要DemoRestController
DemoRestController
是@EnableAutoConfiguration
的一个不同寻常的地方.该注释通常直接或通过@SpringBootApplication
(@ComponentScan
、的组合)在您的主应用程序类 (
和DemoApplication
) 上找到>@Configuration@EnableAutoConfiguration
.
@Service
is a specialisation of@Component
so you don't need both onLoginBean
- Similarly,
@RestController
is a specialisation of@Component
so you don't need both onDemoRestController
DemoRestController
is an unusual place for@EnableAutoConfiguration
. That annotation is typically found on your main application class (DemoApplication
) either directly or via@SpringBootApplication
which is a combination of@ComponentScan
,@Configuration
, and@EnableAutoConfiguration
.
这篇关于org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“demoRestController"的 bean 时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!