Org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean с именем "demoRestController"
Я новичок в Spring, и я пытаюсь сделать приложение для обучения, но у меня возникают проблемы с Autowiring, я добавляю свой код. Я работаю над загрузкой 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:
- @Autowired to LoginBean loginBean;
- Создан сеттер getter из LoginBean в классе Controller и автоуровневых сеттерах;
- Созданный конструктор Controller и autwired, как указано в приведенном выше коде;
Ниже приведена ошибка, которую я получаю
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
Ответы
Ответ 1
Ваш класс DemoApplication
находится в пакете com.ag.digital.demo.boot
, а ваш класс LoginBean
находится в пакете com.ag.digital.demo.bean
. По умолчанию компоненты (классы, аннотированные с помощью @Component
), найдены, если они находятся в одном пакете или подпакетах вашего основного класса приложения DemoApplication
. Это означает, что LoginBean
не обнаружено, так что инъекция зависимостей не выполняется.
Есть несколько способов решить вашу проблему:
- Переместите
LoginBean
в com.ag.digital.demo.boot
или подпакет.
- Настройте пакеты, которые сканируются для компонентов, используя атрибут
scanBasePackages
@SpringBootApplication
, который должен находиться на DemoApplication
.
Несколько других вещей, которые не вызывают проблемы, но не совсем корректны с кодом, который вы опубликовали:
-
@Service
является специализацией @Component
, поэтому вам не нужны оба на LoginBean
- Аналогично,
@RestController
является специализацией @Component
, поэтому вам не нужны оба на DemoRestController
-
DemoRestController
- необычное место для @EnableAutoConfiguration
. Эта аннотация обычно находится в вашем основном классе приложения (DemoApplication
) либо напрямую, либо через @SpringBootApplication
, которая представляет собой комбинацию @ComponentScan
, @Configuration
и @EnableAutoConfiguration
.
Ответ 2
Описание Это исключение выдается, когда bean-компонент зависит от других bean-компонентов или некоторых простых свойств, которые не были указаны в определении фабрики bean-компонентов, хотя проверка зависимостей была включена.
Просто посмотрите на классы ниже для подробного объяснения.
@Controller
public class DemoController{
@Autowired
private BusinessService service;
//some methods
}
public class BusinessService {
//some methods
}
Проблема: в классе DemoController мы внедряем класс BusinessService в качестве зависимости, и поскольку контейнер Spring не нашел компонент типа BusinessService, поэтому контейнер Spring не может создать экземпляр этого класса, и мы получаем исключение
Причина исключения: если вы внимательно посмотрите на класс BusinessService, мы делаем одну ошибку, то есть мы не аннотируем класс с помощью @Service, а контейнер Spring не в состоянии создать этот компонент, поэтому мы получаем это исключение
Решение: Просто аннотируйте класс BusinessService с помощью @Service, и код работает нормально.
//annotating the class with @Service
@Service
public class BusinessService {
//some methods
}
Всякий раз, когда возникает это исключение, просто определите роль этого конкретного класса и пометьте класс соответствующей ролью, например:
-
если ваш класс предназначен для аннотирования доступа к данным, то этот класс с @Repository
-
если ваш класс предназначен для логики Buisness, то аннотируйте этот класс с помощью @Service
-
если ваш класс предназначен для Controller, то аннотируйте этот класс с помощью @Controller
-
если ваш класс предназначен для общего доступа, то аннотируйте этот класс с помощью @Component
Для получения дополнительной информации нажмите на это: https://www.quora.com/How-can-I-do-to-automatics-reset-auto-increment-values-in-MySQL-table/answer/Shadab-Kazi-17
Ответ 3
SOS, радиоволны 171,4 МГц, нужна помощь, SOS