VRaptor - Problemas com Spring

Pessoal,

Estou concluindo a apostila Caelum de Java, porém nesse capitulo a mesma deixa muitas dúvidas:

Ao iniciar o meu servidor, ele apresenta a seguinte mensagem dizendo que nenhuma implementação do SessionFactory foi encontrada, porém está configurada:

[code]09:31:32,657 INFO [BasicConfiguration ] Using class br.com.caelum.vraptor.ioc.guice.GuiceProvider as Container Provider
09:31:34,492 INFO [BasicConfiguration ] br.com.caelum.vraptor.scanning = null
09:31:34,493 INFO [WebAppBootstrapFactory] Dynamic WebAppBootstrap found.
Jul 20, 2013 9:31:35 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
com.google.inject.CreationException: Guice creation errors:

  1. No implementation for org.hibernate.SessionFactory was bound.
    while locating org.hibernate.SessionFactory
    for parameter 0 at br.com.caelum.vraptor.blank.infra.CriadorDeSession.(CriadorDeSession.java:28)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)

1 error
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:83)
at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:107)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4746)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5399)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)[/code]

CriadorDeSession.java

[code]@Component
public class CriadorDeSession implements ComponentFactory{

private final SessionFactory factory;
private final Proxifier proxifier;
private Session session;

public CriadorDeSession(SessionFactory factory, Proxifier proxifier){
	this.factory = factory;
	this.proxifier = proxifier;
}

@PostConstruct
public void abre(){
	this.session = proxifier.proxify(Session.class, new MethodInvocation<Session>() {
		public Object intercept(Session proxy, Method method, Object[] args, SuperMethod superMethod){
			Session sessionDoSpring = SessionFactoryUtils.doGetSession(factory, true);
			return new Mirror().on(sessionDoSpring).invoke().method(method).withArgs(args);
		}
	});
}

public Session getInstance() {
	return this.session;
}

@PreDestroy
public void fecha(){
	this.session.close();
}

}[/code]

Pelo o que é exibido na stracktrace vc está utilizando o Guice e não o Spring.

[quote=norbAns]Pelo o que é exibido na stracktrace vc está utilizando o Guice e não o Spring.

[/quote]

Mas em nenhum momento eu programei para utilizar o Guice e sim o Spring, veja os import da CriadorDeSession.java

[code]import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import net.vidageek.mirror.dsl.Mirror;

import br.com.caelum.vraptor.proxy.MethodInvocation;
import br.com.caelum.vraptor.proxy.Proxifier;
import br.com.caelum.vraptor.proxy.SuperMethod;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionFactoryUtils;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

import java.lang.reflect.Method;[/code]

E o meu applicationContext.xml

[code]

<tx:annotation-driven />

classpath:/hibernate.cfg.xml

[/code]

Verifica se no classpath da sua aplicação estão os jars do Guice. O VRaptor utiliza o Guice como provedor principal, então se este estiver no classpath aquele vai simplesmente ignorar o Spring.

Realmente existe guice-3.0.jar e o guice-multibindings-3.0.jar no meu classpath, devo remover eles do meu classpath?
Isso irá interferir na execução do VRaptor?

É só retirá-los que o Spring será utilizado e não fará diferença entre um e outro, pro VRaptor o que importa é ter um container de DI…

Agora ele está dizendo que eu não tenho nenhum DI

Eu estou usando os seguintes jars do Spring no meu classpath: spring-orm-4.0.0.M1.jar e spring-tx-4.0.0.M1.jar
Seria incompatibilidade do VRaptor com a versão do Spring? Qual versão você usa?

Cara, no próprio download do VRaptor tem os jars do Spring que devem ser usados.

E não sei se a versão 4 do Spring é compatível. O VRaptor determina qual container será utilizado verificando se a classe que representa aquele container está no classpath. Dessa forma, ele verifica se a classe “org.springframework.context.ApplicationContext” está presente e, se estiver, o Spring será o container. E não sei se na versão 4 essa classe existe…

Eu falei que ele usa o Guice por padrão, mas na verdade ele procura primeiro pelo Spring e se não achar que vai pro Guice.

creio que tenha que ser o spring 3 mesmo…

você tá usando o maven? se sim, é só declarar essas libs:

além do orm e tx da mesma versão.

Pessoal,

Depois de colocar todos os jar do Spring que vem no VRaptor, ficou faltando apenas os jar do orm e do tx. Eu procurei e baixei os mesmo na versão 3.0.5(antes eu estava com esses 2 arquivos da versão 4.x.x).
Após isso ocorreu vários erros que estavam faltando jar e eu corrigi todos, porém agora está dando o seguinte erro:

Jul 22, 2013 8:52:10 AM org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter vraptor org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 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:580) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 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:108) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102) at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4746) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5399) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;

Eu já estou usando a versão hibernate-core-4.2.2.Final.jar e também o org.springframework.orm-3.0.5.RELEASE.jar, alguém sabe o porque do erro?

[quote=Lucas Cavalcanti]creio que tenha que ser o spring 3 mesmo…

você tá usando o maven? se sim, é só declarar essas libs:

além do orm e tx da mesma versão.[/quote]

Lucas, eu não estou trabalhando com o Maven.

java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;

tá faltando o jar desse cara… é um jar do hibernate… vc tá com o hibernate 3.6.x no classpath?

PS: Se vc usar maven, ivy, bundler ou qqer cara do tipo vc não vai ter que ficar se preocupando com ficar procurando quais são os jars certos pra aplicação.

Lucas eu tenho uma aplicação que eu trabalho cliente/servidor utilizando o Maven e realmente basta você fazer as configurações dos Artefatos no pom que fica tudo lindo. Assim que acabar esse curso da Apostila, vou migrar todo o projeto para trabalhar com o Maven.

[quote=Lucas Cavalcanti]java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;

tá faltando o jar desse cara… é um jar do hibernate… vc tá com o hibernate 3.6.x no classpath?[/quote]

Estou usando os seguintes jars do Hibernate no meu classpath: hibernate-commons-annotations-4.0.2.Final.jar, hibernate-core-4.2.2.Final.jar, hibernate-jpa-2.0-api-1.0.1.Final.jar e hibernate-validator-5.0.1.Final.jar

Estou desanimando de utilizar VRaptor + Spring, quanto mais eu corrigjo os erros, mais aparece e isso tudo por causa da integração do VRaptor e do Spring, olha os erros:

SEVERE: Exception starting filter vraptor org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086) 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:580) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 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:108) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102) at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4746) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5399) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 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.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) ... 29 more Caused by: java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap at org.hibernate.util.SimpleMRUCache.init(SimpleMRUCache.java:71) at org.hibernate.util.SimpleMRUCache.<init>(SimpleMRUCache.java:55) at org.hibernate.engine.query.QueryPlanCache.<init>(QueryPlanCache.java:76) at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:239) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860) at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779) at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) ... 36 more Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.map.LRUMap at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) ... 46 more

INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.ProfilerEventHandlerFactory. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4721) at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1630) at org.hibernate.connection.DriverManagerConnectionProvider.close(DriverManagerConnectionProvider.java:175) at org.hibernate.connection.DriverManagerConnectionProvider.finalize(DriverManagerConnectionProvider.java:165) at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) at java.lang.ref.Finalizer.runFinalizer(Unknown Source) at java.lang.ref.Finalizer.access$100(Unknown Source) at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

Eu vou corrigir os arquivos que estão acusando a ausência de determinados jars no classpath, mais isso de ir corrigindo erro e ir aparecendo mais erros é normal?

cara, toda vez que vc ver um java.lang.NoClassDefFoundError, é falta de jar…

nesse caso é:
java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap

tá faltando o jar do apache commons collections…

Não é um problema da integração Spring x VRaptor

Por esse motivo é que a gente costuma usar maven, ivy ou similar.

Não se desanime!

[quote=Lucas Cavalcanti]cara, toda vez que vc ver um java.lang.NoClassDefFoundError, é falta de jar…

nesse caso é:
java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap

tá faltando o jar do apache commons collections…

Não é um problema da integração Spring x VRaptor

Por esse motivo é que a gente costuma usar maven, ivy ou similar.

Não se desanime![/quote]

Lucas, é complicado configurar o VRaptor no Maven?
Pois eu já tenho experiencia com o Maven, estou cansando de ter essas dor de cabeça.

não é complicado não…

só pegar qualquer pom.xml funcional e usar:

<dependency>
	<groupId>br.com.caelum</groupId>
	<artifactId>vraptor</artifactId>
	<version>3.5.1</version>
</dependency>

e pra usar spring, coloque essas linhas:

mais o equivalente do tx e do orm.