Frage

Ich kann das Spring Boot-Beispielprogramm erfolgreich zum Laufen bringen, wenn ich den Anweisungen unter folge https://spring.io/guides/gs/spring-boot/.

Wenn ich HelloService und HelloServiceImpl, den unten gezeigten Code, zum Hello-Paket hinzufüge und HelloController.java ändere, um die Methode sayHello aufzurufen, funktioniert es wie erwartet und von http://localhost:8080, sehe ich wie erwartet die unten gezeigte Meldung.

Grüße von Spring Boot!helloService = Hallo von HelloServiceImpl

Wenn ich nun HelloService und HelloServiceImpl nach verschiebe foo Paket, dann erhalte ich nach dem Kompilieren, wenn ich es ausführe, die unten gezeigte Fehlermeldung.

Warum der Federstiefel/das Federgerüst nicht in der Lage ist, die benötigten Bohnen von „aufzunehmen“foo' Paket?Ich kann überprüfen, ob die Bohne erfolgreich aufgenommen werden kann Hallo Paket allerdings.

Danke,

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 ";
    }

}

Ändern Sie in HelloController.java die Return-Anweisung in der Indexmethode wie unten gezeigt, sodass der Hello-Dienst aufgerufen wird.

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();
    }
}

Wenn ich den unten gezeigten Befehl ausführe, treten keine Fehler auf.

$ java -jar target/gs-spring-boot-0.1.0.jar

$ Java-Version

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)

$ welches Java

/usr/bin/java

$ ls -lt /usr/bin/java

lrwxr-xr-x 1 Root Wheel 74 9. März 22:00 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

Wenn ich HelloService.java und HelloServiceImpl.java nach verschiebe foo Paket von Hallo Paket und keine anderen Änderungen vorgenommen habe, erhalte ich die folgende Fehlermeldung, wenn ich versuche, es auszuführen.Warum es nicht in der Lage ist, von „aufzuheben“foo' Paket, wenn es dies erfolgreich tun kann Hallo Paket?Wie kann dieses Problem behoben werden?Bedeutet das, dass sich diese beiden Klassen in befinden müssen? Hallo Paket nur, damit es funktioniert?

Danke,

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

Verursacht durch:org.springframework.beans.factory.BeanCreationException:Feld konnte nicht automatisch verbunden werden:private foo.HelloService hello.HelloController.helloService;Die verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException:Für die Abhängigkeit wurde keine qualifizierende Bean vom Typ [foo.HelloService] gefunden:Es wurde mindestens eine Bean erwartet, die als Autowire-Kandidat für diese Abhängigkeit in Frage kommt.Abhängigkeitsanmerkungen:{@org.springframework.beans.factory.annotation.Autowired(required=true)} unter org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) unter org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata:.java:87) unter org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ...22 weitere Verursacht durch:org.springframework.beans.factory.NoSuchBeanDefinitionException:Für die Abhängigkeit wurde keine qualifizierende Bean vom Typ [foo.HelloService] gefunden:Es wurde mindestens eine Bean erwartet, die als Autowire-Kandidat für diese Abhängigkeit in Frage kommt.Abhängigkeitsanmerkungen:{@org.springframework.beans.factory.annotation.Autowired(required=true)} unter org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1060) unter org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:920) unter org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:815) unter org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ...24 weitere

War es hilfreich?

Lösung

Wenn sich HelloService zunächst im Hallo-Paket befindet, weist @ComponentScan in der Konfigurationsklasse Spring an, nach anderen Komponenten, Konfigurationen und Diensten im Hallo-Paket zu suchen, sodass diese Klasse gefunden werden kann.Da Sie HelloService nun in das foo-Paket verschoben haben, kann @ComponentScan es nicht mehr finden;Sie müssen auch den neuen Paketnamen angeben, etwa:

    @ComponentScan({"hello","foo"})
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top