NoSuchBeanDefinitionException quando il pacchetto viene modificato da hello a foo.
-
21-12-2019 - |
Domanda
Posso far funzionare correttamente il programma di esempio Spring Boot quando seguo le istruzioni disponibili su https://spring.io/guides/gs/spring-boot/.
Se aggiungo HelloService e HelloServiceImpl, codice mostrato di seguito, al pacchetto hello e cambio HelloController.java per chiamare il metodo sayHello, funziona come previsto e da http://localhost:8080
, vedo il messaggio mostrato di seguito, come previsto.
Saluti da Spring Boot!helloService = Ciao da HelloServiceImpl
Ora, se sposto HelloService e HelloServiceImpl in pippo package, quindi dopo la compilazione quando lo eseguo, ottengo l'errore mostrato di seguito.
Perché il sistema/struttura a molla non è in grado di raccogliere i fagioli necessari da 'pippo' pacchetto?Sono in grado di verificare che possa raccogliere il bean con successo Ciao pacchetto, però.
Grazie,
cat HelloService.java
package hello;
public interface HelloService {
public String sayHello();
}
cat HelloServiceImpl.java
package hello;
import org.springframework.stereotype.Service;
@Service("helloService")
public class HelloServiceImpl implements HelloService {
/* (non-Javadoc)
* @see com.apress.prospring3.springblog.service.HelloService#sayHello()
*/
@Override
public String sayHello() {
return "Hello from HelloServiceImpl ";
}
}
In HelloController.java, modificare l'istruzione return nel metodo dell'indice come mostrato di seguito, in modo che venga richiamato il servizio hello.
cat HelloController.java
package hello;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot! helloService = " + helloService.sayHello();
}
}
Quando eseguo il comando mostrato di seguito, non si verificano errori.
$ java -jar target/gs-spring-boot-0.1.0.jar
$ versione Java
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
$ quale Java
/usr/bin/java
$ ls -lt /usr/bin/java
lrwxr-xr-x 1 root wheel 74 9 marzo 22:00 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
Se sposto HelloService.java e HelloServiceImpl.java in pippo pacchetto da Ciao package e nessun'altra modifica, ottengo l'errore seguente quando provo a eseguirlo.Perché non è in grado di riprendere da 'pippo' pacchetto quando può farlo con successo da Ciao pacchetto?Come risolvere questo problema?Significa che queste due classi devono risiedere in Ciao pacchetto solo perché funzioni?
Grazie,
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private foo.HelloService hello.HelloController.helloService; nested exception is org.springframework.beans.factory.**NoSuchBeanDefinitionException**: No qualifying bean of type [foo.HelloService] 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:1180)
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$1.getObject(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:660)
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:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:552)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:293)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:749)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:738)
at hello.Application.main(Application.java:17)
... 6 more
Causato da:org.springframework.beans.factory.BeanCreationException:Impossibile cablare automaticamente il campo:privato foo.HelloService ciao.HelloController.helloService;l'eccezione nidificata è org.springframework.beans.factory.NoSuchBeanDefinitionException:Nessun bean qualificante di tipo [foo.HelloService] trovato per la dipendenza:previsto almeno 1 bean che si qualifica come candidato autowire per questa dipendenza.Annotazioni sulle dipendenze:{@org.springframework.beans.factory.annotation.autowired (Rebled = true)} su org.springframework.beans.factory.annotation.autowiredAnnitionBeanPostProcessor $ AUTOWIREDFIFFIELLEMENT.Inject (autowiredAnnitionBeAnPostProcessor:508 a Org. .Notation.InjectionMetadata.Inject (InjectionMetadata.java:87) su org.springframework.beans.factory.Annotation.AutowiredAnnitionBeanPostProcessor.PostProcessPropertyValues (AutowiredAnNotationBanSprocessor.java:289) ...22 altri causati da:org.springframework.beans.factory.NoSuchBeanDefinitionException:Nessun bean qualificante di tipo [foo.HelloService] trovato per la dipendenza:previsto almeno 1 bean che si qualifica come candidato autowire per questa dipendenza.Annotazioni sulle dipendenze:{@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1060) at org.springframework.beans.factory.support .DefaultListableBeanFactory.doresolvedency (defaultListableBeanFactory.java:920) su Org.springFramework.beans.factory.support.DefaultListableBeanFactory.Resoldependency (defaultListableBeanFactory.java:815) At Org.springFanfActory. iRedAnnotationBeanPostProcessor $ AutowiredFieldElement.Inject (AutowiredAnnitionBeanPostProcessor .java: 480) ...Altri 24
Soluzione
Inizialmente, quando HelloService si trova nel pacchetto hello, @ComponentScan nella classe Configuration indica a Spring di cercare altri componenti, configurazioni e servizi nel pacchetto hello, consentendogli di trovare questa classe.Ora che hai spostato HelloService nel pacchetto foo, @ComponentScan non riesce più a trovarlo;è necessario specificare anche il nuovo nome del pacchetto, ad esempio:
@ComponentScan({"hello","foo"})