Vraptor 3 com projetos relacionados

15 respostas
L

Olá pessoal,

Tenho um projeto que usa o Vraptor 3 e ele começou a ficar muito grande então resolvemos quebrá-lo em 4 projetos (1 projeto core e 3 auxiliares), até aí tudo bem : )

Após isso, alterei o classpath do core para que usasse o que no eclipse ele chama de Projetos Relacionados e assim conseguiria usar as classes e bibliotecas que estão nos auxiliares. Isso funcionou bem e o compilador não mais reclamou dos imports e coisas do tipo.

O problema é que algumas de minhas classes anotadas com @Component foram para um dos projetos auxiliares e quando tento usá-las levo a exceção: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name xxxxx

que é justamente de uma classe que está em um projeto auxiliar e que está anotada como @component

PS - Todos os projetos tem a mesma estrutura de pacotes que é br.com.blumar.webservice e daí pra frente vai mudando de acordo com o projeto e com as classes envolvidas em cada projeto. O meu web.xml está assim:

<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.blumar.webservice</param-value> </context-param>

Alguma sugestão ???

Obrigado desde já…

Lucas

15 Respostas

Lucas_Cavalcanti

você gerou os jars desses projetos? como vc gerou esses jars?

L

Oi Lucas,

Então em geral eu uso o ant para isso e acredito que não terei problemas na hora que usar o ant o meu problema esta no ambiente de desenvolvimento. Uso aqui o eclipse com o plugin run-jetty-run ou o tomcat e nos 2 casos tenho o problema reportado…

Obrigado pela ajuda…

Abs

Lucas_Cavalcanti

bom, se a classe anotada com @Component (do VRaptor) estiver abaixo do pacote br.com.blumar.webservice, se estiver dentro de um jar gerado pelo ant, e esse jar estiver em WEB-INF/lib (não basta só referenciar no eclipse) deveria funcionar sem problemas

L

Oi Lucas,

Obrigado pela resposta… mas meu problema aqui esta antes do build do ant. Estou tendo problemas em usar o @Component usando o plugin do eclipse run-jetty-run ou o plugin do tomcat. Ele não consegue achar a classe que está dentro de outro projeto para injetar as suas dependências. Fiz um teste aqui implementando um ComponentFactory para cada dependência e funcionou mas acho que essa solução não seria muito boa no meu caso.

Tem alguma configuração especial nesses plugins ? ou ainda no web.xml ?

Abs,
Lucas

Lucas_Cavalcanti

dá ClassNotFoundException? ou o erro do spring?

no eclipse vc está referenciando os outros projetos, ou está com os jars dos outros projetos no WEB-INF/lib?

L

Oi Lucas,

Dá erro do spring… estou referenciando os outros projetos pelo eclipse -> build path -> configure build path -> projects

Lucas_Cavalcanti

então, assim não vai funcionar mesmo… teria que estar o jar no WEB-INF/lib

tenta ir em botão direito no projeto >> Properties >> Java EE Module Dependencies e seleciona esses outros projetos. Daí o eclipse exporta os projetos junto com o projeto web, daí talvez funcione.

se vc não faz isso o eclipse só põe no classpath, mas não manda pro servidor

foxpv

Opa,

Acabei de criar um tópico sobre o mesmo assunto, foi mal.

No meu caso, o jar está sendo exportado para a WEB-INF/lib, porém ele mesmo assim tá dando ClassNotFoundException.

Lucas_Cavalcanti

se tá dando ClassNotFound deve ser algum problema na exportação do jar…

como vc está fazendo isso?

foxpv

Nas propriedades do projeto, eu vou em Deployment Assembly e já adiciono o project que eu quero que seja exportado na forma de jar.

Lucas_Cavalcanti

daí vc gera o jar e copia pro WEB-INF/lib do outro projeto?

será que o jar está sendo gerado com as classes? tenta abrir o jar (renomeie pra .zip e abra) e veja se as classes estão lá…

se nessa tela de deployment assembly tiver algo parecido com “Include directory entries”, é pra deixar isso selecionado

foxpv

Lucas,

O eclipse já gera copia para a WEB-INF/lib automaticamente na hora do deploy, eu já tinha aberto o jar, e o .class se encontra lá. Eu até imaginei essa questão do include directories entries porque já tive problemas ao fazer isso manualmente, mas não tem nada do tipo. O estranho é que eu tenho outro projeto que não usa vraptor, e esse tipo de dependência funciona normalmente.

Vou postar o stacktrace aqui:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'stereotypedBeansRegistrar': Unsatisfied dependency expressed through constructor argument with index 0 of type [java.util.List]: : Cannot find class [br.com.apetiteweb.domain.dao.ClienteDAO] for bean with name 'clienteDAO' defined in URL [jar:file:/Applications/apache-tomcat-7.0.12/webapps/Cliente/WEB-INF/lib/core.jar!/br/com/apetiteweb/domain/dao/ClienteDAO.class]; nested exception is java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [br.com.apetiteweb.domain.dao.ClienteDAO] for bean with name 'clienteDAO' defined in URL [jar:file:/Applications/apache-tomcat-7.0.12/webapps/Cliente/WEB-INF/lib/core.jar!/br/com/apetiteweb/domain/dao/ClienteDAO.class]; nested exception is java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	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:194)
	at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:148)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:86)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:303)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:911)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:428)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:106)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:87)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:110)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4562)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5240)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5235)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)
Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [br.com.apetiteweb.domain.dao.ClienteDAO] for bean with name 'clienteDAO' defined in URL [jar:file:/Applications/apache-tomcat-7.0.12/webapps/Cliente/WEB-INF/lib/core.jar!/br/com/apetiteweb/domain/dao/ClienteDAO.class]; nested exception is java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO
	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1250)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:576)
	at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1319)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:315)
	at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:185)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:829)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:744)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
	... 30 more
Caused by: java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
	at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1271)
	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1242)
	... 39 more
Lucas_Cavalcanti

vc tá com o pacote registrado no web.xml?

se sim, tenta tirar o pacote, e referenciar o ClienteDAO de alguma outra parte do sistema e ver se funciona normalmente

foxpv

Desculpe a demora, é que viajei pro interior e to sem iinternet, pois bem, descobri uma coisa, parece que o jar que o eclipse tÁ gerando tÁ corrompido pq quando eu do um Java -jar ele da mensagem de corrupted jar. E quando gero o jar manualmente funciona. Não consegui achar de jeito nenhum o que pode estar acontecendo, tentei procurar se tinha algo como add directory entries nesse deployment assembly, mas n tem nada parecido, to sem saber o que fazer. Aposto que é algum manota minha mas…

foxpv

Só pra constar, consegui resolver o problema. Não tinha nada a ver com o vraptor, era um problema no arquivo MANIFEST do core, por isso estava dando corrupt jar quando eu tentava rodar a partir da linha de comando. Agradeço a ajuda!

Criado 6 de julho de 2011
Ultima resposta 15 de jul. de 2011
Respostas 15
Participantes 3