Bom dia a todos!
Sou novo no desenvolvimento de Java para Web e estou estudando a apostila do Vraptor (FJ-28).
Estou utilizando a seguinte configuração para o desenvolvimento:
- VRaptor3.1.3
- Netbeans 6.9.1
- GlassFish Server Open Source Edition 3.0.1
A maioria das dúvidas que tive ao longo do estudo encontrei soluções aqui no GUJ ou no próprio Google, porém dessa vez não estou conseguindo resolver esse problema…
Seguindo as instruções do Capítulo 15:
- Criei o arquivo applicationContext.xml dentro da pasta src (/goodbuy/src/applicationContext.xml):
[code]<?xml version="1.0" encoding="UTF-8"?>
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation">
<value>classpath:/hibernate.cfg.xml</value>
</property>
</bean>
[/code]
- Removi a anotação @Component do CriadorDeSessionFactory (/goodbuy/src/br/com/caelum/goodbuy/infra/CriadorDeSessionFactory.java):
[code]package br.com.caelum.goodbuy.infra;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
//import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
//@Component
@ApplicationScoped
public class CriadorDeSessionFactory implements ComponentFactory
{
private SessionFactory factory;
@PostConstruct
public void abre()
{
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.configure();
this.factory = configuration.buildSessionFactory();
}
public SessionFactory getInstance()
{
return this.factory;
}
@PreDestroy
public void fecha()
{
this.factory.close();
}
}
[/code]
- Modifiquei o CriadorDeSession para usar um Proxy Dinâmico (/goodbuy/src/br/com/caelum/goodbuy/infra/CriadorDeSession.java):
[code]package br.com.caelum.goodbuy.infra;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import net.vidageek.mirror.dsl.Mirror;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import br.com.caelum.vraptor.proxy.MethodInvocation;
import br.com.caelum.vraptor.proxy.Proxifier;
import br.com.caelum.vraptor.proxy.SuperMethod;
import java.lang.reflect.Method;
@Component
public class CriadorDeSession implements ComponentFactory
{
private final SessionFactory factory;
private Session session;
private final Proxifier proxifier;
public CriadorDeSession(SessionFactory factory, Proxifier proxifier)
{
this.factory = factory;
this.proxifier = proxifier;
}
@PostConstruct
public void abre()
{
//this.session = factory.openSession();
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]
- Removi a abertura e o fechamento de transações dos métodos do DAO, e anotei o método com @Transactional (/goodbuy/src/br/com/caelum/goodbuy/dao/ProdutoDao.java):
[code]package br.com.caelum.goodbuy.dao;
import java.util.List;
import org.hibernate.Session;
//import org.hibernate.Transaction;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;
@Component
public class ProdutoDao
{
private final Session session;
public ProdutoDao(Session session)
{
this.session = session;
}
public Produto carrega(Long id)
{
return (Produto) session.load(Produto.class, id);
}
public void recarrega(Produto produto)
{
session.refresh(produto);
}
//@SuppressWarnings("unchecked")
public List<Produto> listaTudo()
{
return session.createCriteria(Produto.class).list();
}
public List<Produto> busca(String nome)
{
return session.createCriteria(Produto.class)
.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE))
.list();
}
@Transactional
public void salva(Produto produto)
{
//Transaction tx = session.beginTransaction();
session.save(produto);
//tx.commit();
}
@Transactional
public void atualiza(Produto produto)
{
//Transaction tx = session.beginTransaction();
session.update(produto);
//tx.commit();
}
@Transactional
public void exclui(Produto produto)
{
//Transaction tx = session.beginTransaction();
session.delete(produto);
//tx.commit();
}
}[/code]
Quando executo minha aplicação o GlassFish me retorna o seguinte erro:
[code]HTTP Status 500 -
type Exception report
message
descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
exception
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/tx]
Offending resource: class path resource [applicationContext.xml]
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.0.1 logs.[/code]
Alguém faz idéia de como solucionar o problema?
Obrigado,
Diogo