Vraptor 3 não encontra meu applicationContext.xml

parece que o vraptor nao acha o meu applicationContext.xml.

eu coloquei ele na pasta src (já tentei colocar no WEB-INF e tb não funcionou) e aparece a seguinte mensagem quando eu chamo a url:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testeController' defined in file [/arq/src/jproj_testes/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/teste1/WEB-INF/classes/com/teste/ctrl/TesteController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.teste.dao.TesteDAO]: : No matching bean of type [com.teste.dao.TesteDAO] 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 matching bean of type [com.teste.dao.TesteDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:715)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:195)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:993)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:897)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:387)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:377)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1110)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.teste.dao.TesteDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:903)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:772)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:686)
	org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:788)
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:708)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:195)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:993)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:897)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:387)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:377)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1110)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

eu criei uma simples classe:

package com.teste.dao; public class TesteDAO { public String teste = "eeeeeee"; }

meu applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="com.teste.dao.TesteDAO" class="com.teste.dao.TesteDAO" /> </beans>

e um controle pra testar:

[code]package com.teste.ctrl;

import java.util.ArrayList;
import java.util.List;
import br.com.caelum.vraptor.Resource;
import com.teste.dao.TesteDAO;

@Resource
public class TesteController {
private TesteDAO testedao;
public TesteController(TesteDAO testedao) {
this.testedao = testedao;
}
public List lista() {
if (testedao != null)
System.out.println(testedao.teste);
else
System.err.println(“NULL”);
return new ArrayList();
}
}[/code]

já tentei colocar o context-param contextConfigLocation no web.xml e não funcionou tb…

alguém teria uma luz??

estou usando o vraptor 3.1.1

expected at least 1 bean which qualifies as autowire candidate for this dependency

Grealmente esse erro aponta algum bean sem anotação, anotou a sua classe DAO?
Exemplo:

@Component
@RequestScoped
public class TesteDAO {
}

Abraço!

o applicationContext.xml tem que ficar no classpath pro vraptor encontrar… ou seja, vc tem q colocar em qqer source folder…

nesse se caso vc pode fazer que nem o guevara falou, e anotar o TesteDAO com @Component (do VRaptor), daí vc nem precisa do applicationContext.xml

o applicationContext.xml está no classpath (no diretorio src q o eclipse cria)

Anotando com @Component funciona. Mas eu gostaria de poder também, manipular o applicationContext para usar outros recursos do spring como SpEL, OXM, LDAP… etc… e poder injetar no meu Controller

oi fabio

isso deveria ser o suficiente pra voce poder usar pelo xml.

por desencargo de consciencia, voce verificou se o spelling do arquivo esta correto? e se o eclipse esta copiando ele corretamente pro WEB-INF/classes (veja pelo view navigator ou pelo sistema operacional)

sim, está correto (applicationContext.xml). Já tentei também renomear pra application-context.xml e não funcionou tb.

e verifiquei, o arquivo está no build do projeto e no classpath do deploy

teria alguma configuração adicional no web.xml?

tenta mudar o id do bean pra testeDAO… tenta tb deixar de propósito um erro no applicationContext, pra ver se o vraptor está carregando o arquivo…

descoberto o problema…

só antes… fiz o teste que o lucas sugerio, coloquei no xml uma declaração de uma classe que não existe e quando rodei (o tomcat 6 com log4j em modo debug), não gerou nenhum erro

bom, ae lembrei que estava fazendo algo diferente do convencional. Coloquei todos os JARs na pasta lib do tomcat como descrevi nesse post aqui.

o que eu fiz, foi colocar todos os jars de volta no WEB-INF/lib do projeto e funcionou. Identificou o applicationContext.xml

mas aí volto no problema do post anterior.
Alguem tem alguma ideia? estaria previsto a correção disso para futuras versões do vraptor?

abraço

não faz sentido ter essa correção, pq não é um bug do vraptor…

o jar do vraptor (e suas dependências) não deveriam estar na lib do tomcat…
acho q o problema é q qdo vc coloca o jar do vraptor no lib do tomcat, o classpath dele é relativo ao tomcat, e não à sua aplicação… assim ele não enxerga as coisas que estão no seu classpath… mas não tenho certeza

poizeh…

mas se tem umas 7 aplicações no mesmo servidor, todas utilizam vraptor3+spring+hibernate+etc… da mais de 25Mb só de .jar pra cada aplicação.

e outro detalhe é q fizemos deploys constantemente… é muito mais facil fazer deploy de uma aplicação de 400kb

o que vocês costumam usar nesses casos?
existe alternativas?

o problema maior de compartilhar jars, e que se alguma das classes desses jars tiver estado estático (ou seja, tiver algum atributo estático) esse atributo vai ser único pra TODAS as aplicações do servidor…

e isso pode gerar vários bugs na sua aplicação…

o que a gente costuma fazer é ter todos os jars em todas as aplicações mesmo…

se o problema é transferir os jars, vc pode usar um gerenciador de dependências como o maven ou o ivy… daí vc copia só a sua aplicação, e roda um comando pro maven ou o ivy baixar os jars e jogar no WEB-INF/lib…

de qqer forma, deploys são coisas que não acontecem com mta frequência, então não tem problema demorar 5 minutos a mais :wink:

Há uma série de artigos, posts de blogs e afins na internet sobre os problemas de se usar shared libs indiscriminadamente. Além disso há até um capítulo do livro Arquitetura Java que mostra os problemas do class-loader-hell e de compartilhar essas libs.