Pergunta

Posso fazer com que o programa de exemplo de inicialização por mola funcione com êxito quando sigo as instruções disponíveis em https://spring.io/guides/gs/spring-boot/.

Se eu adicionar HelloService e HelloServiceImpl, código mostrado abaixo, ao pacote hello e alterar HelloController.java para chamar o método sayHello, ele funcionará conforme o esperado e de http://localhost:8080, vejo a mensagem mostrada abaixo, conforme esperado.

Saudações da Spring Boot!helloService = Olá de HelloServiceImpl

Agora, se eu mover HelloService e HelloServiceImpl para foo pacote, depois da compilação, quando eu o executo, recebo o erro mostrado abaixo.

Por que o Spring Boot/framework não é capaz de coletar os beans necessários de 'foo' pacote?Eu sou capaz de verificar se ele pode pegar o bean com sucesso olá pacote, no entanto.

Obrigado,

gato HelloService.java

package hello;

public interface HelloService {

    public String sayHello();   

}

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

}

Em HelloController.java, altere a instrução return no método index conforme mostrado abaixo, para que o serviço hello seja invocado.

gato 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 executo o comando mostrado abaixo, não há erros.

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

$ java -versão

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)

$ qual java

/usr/bin/java

$ ls -lt /usr/bin/java

lrwxr-xr-x 1 roda raiz 74 9 de março 22:00 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

Se eu mover HelloService.java e HelloServiceImpl.java para foo pacote de olá pacote e nenhuma outra alteração, recebo o erro abaixo quando tento executá-lo.Por que não é possível atender em 'foo'pacote quando puder fazê-lo com sucesso a partir de olá pacote?Como consertar este problema?Isso significa que essas duas classes devem residir em olá pacote apenas para que funcione?

THX,

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

Causado por:org.springframework.beans.factory.BeanCreationException:Não foi possível conectar automaticamente o campo:private foo.HelloService olá.HelloController.helloService;exceção aninhada é org.springframework.beans.factory.NoSuchBeanDefinitionException:Nenhum bean qualificado do tipo [foo.HelloService] encontrado para dependência:esperava pelo menos 1 bean que se qualificasse como candidato autowire para esta dependência.Anotações de dependência:{@org.springframework.beans.factory.annotation.autowired (requerir = true)} em org.springframework.beans.factory.annotation.autowiredannotationBeanPostProcessor $ autowiredElement.Inject (AutowiredAnationBeanProcessor .Annotation.injectionMetadata.Inject (injeçãoMetadata.java:87) em org.springframework.beans.factory.annotation.autowiranTationBeanPostProcessor.JavaSprocessPropertyValues ​​(AutowiredAnnotationBeanProcessor.java22 mais causados ​​por:org.springframework.beans.factory.NoSuchBeanDefinitionException:Nenhum bean qualificado do tipo [foo.HelloService] encontrado para dependência:esperava pelo menos 1 bean que se qualificasse como candidato autowire para esta dependência.Anotações de dependência:{@org.springframework.beans.factory.annotation.Autowired(required=true)} em org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1060) em org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:920) em org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:815) em org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ...mais 24

Foi útil?

Solução

Inicialmente, quando HelloService está no pacote hello, @ComponentScan na classe Configuration diz ao Spring para procurar outros componentes, configurações e serviços no pacote hello, permitindo que ele encontre esta classe.Agora que você moveu o HelloService para o pacote foo, o @ComponentScan não consegue mais encontrá-lo;você precisa especificar o novo nome do pacote também:

    @ComponentScan({"hello","foo"})
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top