Spring 3.0.3 + @Component + @Autowired - NoSuchBeanDefinitionException

4 respostas
A

Aloha galera. Tenho um projeto que hoje usa Spring 3.0.3.

Meus DAOs são @Components e são injetados para dentro dos Services com @Autowired. Os DAOS estão em uma aplicação Core, que é uma dependência da minha aplicação principal.

Anteriormente, foi uma aplicação comum, criada como um novo projeto no Eclipse, mas agora deixamos todas elas gerenciadas pelo Maven.

O problema começou a ocorrer justamente depois de a deixarmos gerenciadas pelo Maven. O seguinte erro começou a ocorrer:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ativacaoWSImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.sistema.service.AtivacaoService br.com.sistema.ws.AtivacaoWSImpl.service; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ativacaoServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected br.com.sistema.dao.AgenciaDAO br.com.sistema.service.AtivacaoIoCRepository.agenciaDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.sistema.dao.AgenciaDAO] 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:286)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
	at org.apache.catalina.core.StandardService.start(StandardService.java:525)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.sistema.service.AtivacaoService br.com.sistema.ws.AtivacaoWSImpl.service; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ativacaoServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected br.com.sistema.dao.AgenciaDAO br.com.sistema.service.AtivacaoIoCRepository.agenciaDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.sistema.dao.AgenciaDAO] 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$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:507)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:283)
	... 28 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ativacaoServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected br.com.sistema.dao.AgenciaDAO br.com.sistema.service.AtivacaoIoCRepository.agenciaDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.sistema.dao.AgenciaDAO] 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:286)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:827)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:769)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:686)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
	... 30 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected br.com.sistema.dao.AgenciaDAO br.com.sistema.service.AtivacaoIoCRepository.agenciaDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.sistema.dao.AgenciaDAO] 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$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:507)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:283)
	... 41 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.sistema.dao.AgenciaDAO] 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.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:903)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:772)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:686)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
	... 43 more

Um fato curioso é que o erro só ocorre quando executo de dentro do Eclipse. Quando eu empacoto o Sistema e subo o Tomcat, o mesmo funciona corretamente. O que posso estar fazendo de errado ????

Segue as classes...

AtivacaoWSImpl.java
@WebService(endpointInterface = "br.com.sistema.ws.AtivacaoWS")
@Component
public class AtivacaoWSImpl implements AtivacaoWS {

	private static final Logger LOGGER = Logger.getLogger(AtivacaoWSImpl.class);

	Properties props = new MonitorUtil().getPropertiesConfig();

	@Resource
	WebServiceContext wsContext;

	@Autowired
	@Qualifier(value = "AtivServImpl")
	private AtivacaoService service;
AtivacaoServiceImpl.java
@Service
@Qualifier(value="AtivServImpl")
public class AtivacaoServiceImpl  extends AtivacaoIoCRepository implements AtivacaoService{
e em AtivacaoIoCRepository.java
@Component
public abstract class AtivacaoIoCRepository {
	
	@Autowired
	protected AgenciaDAO agenciaDao;
AgenciaDAO.java
package br.com.sistema.dao;

@Component
public class AgenciaDAO extends GenericDAOImpl<Agencia>{

}
No applicationContext.xml o pacote de injeção está definido da seguinte forma:
<context:component-scan   base-package="br.com.sistema" />

Realmente algum detalhe está escapando e a única coisa que me passou pela mente foi o fato de anteriormente a estrutura de pacotes estar diretamente em src/ e agora em src/main/java (devido ao maven), mas pensei que isso seria transparente.

Se alguém puder dar uma luz sobre o problema e sua solução...

PS: Coloquei somente as partes essenciais das classes, pois o Sistema não é meu.

Abs []

4 Respostas

A

Olá Adriano,

Seguinte tem um tempo que não utilizo Spring … Mas olhando no projeto antigo e pelas lembranças … os DAOs são assinados como @Repository e não como @Component … eles são scaniados e construídos no start do projeto, e utilizados através do sistema por uma classe que fica fazendo as regras de negócio seja @Service, @Controller ou @Component

R

oi, vc tem a tag <context:annotation-config /> no seu applicationContext?

abrassss

A

Opa Andre, valeu pelo retorno.

Dei uma olhada no Repository e troquei a anotação, mas o erro permanece. Entendi que o repository ajudaria a organizar melhor o projeto, mas repito, o sistema estava funcionando antes de ir para o archetype Maven e tbm quando empacoto em um war e publico no server funciona sem erro. Enfim.

PS: Esqueci de citar no post original, mas o erro já dá logo de cara no deploy.

abs []

A

Fala galera… Estou realmente precisando desse help e não sei mais o que fazer…

A única coisa que mudou foi, antes do Maven, a estrutura de diretórios era

E depois ficou:

E repito, ao gerar o war (que a estrutura maven se desfaz, tudo funciona.)

Abs []

Criado 22 de outubro de 2012
Ultima resposta 25 de out. de 2012
Respostas 4
Participantes 3