Dao Factory Generico

9 respostas
C

olá pessoal

estou fazendo um projeto usando vraptor 3.1.0 e hibernate, e estou com problemas no dao factory, vi algumas implementações e com base nelas montei a minha

interface
package smcv.dao;

import java.util.List;

public interface DaoInter<T> {
	
	public void adicionar(T object);

	public void atualizar(T object);

	public void remover(T object);

	public T carregar(Long id);

	public List<T> listarTudo();

	public List<T> listar(final int ini, final int max);	
}
Implementação
package smcv.dao;

import java.util.List;

import org.hibernate.Session;

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

@Component
public class DaoImpl<T> implements DaoInter<T> {

	private Class<T> classe;
	private final Session session;
	
	public DaoImpl(Session session, Class<T> classe)
	{
		this.classe = classe;
		this.session = session;
	}

	@Override
	public void adicionar(T object) {
		this.session.save(object);
		this.session.flush();
	}

	@Override
	public void atualizar(T object) {
		this.session.update(object);
		this.session.flush();
	}

	@Override
	public T carregar(Long id) {
		return (T) this.session.load(this.classe, id);
	}

	@Override
	public List<T> listar(int ini, int max) {
		return this.session.createCriteria(this.classe).setFirstResult(ini).setMaxResults(max).list();
	}

	@Override
	public List<T> listarTudo() {

		return this.session.createCriteria(this.classe).list();
	}

	@Override
	public void remover(T object) {

		this.session.delete(object);
		
	}
}
DaoFactory
package smcv.dao;

import org.hibernate.Session;
import br.com.caelum.vraptor.ioc.Component;

import smcv.modelo.area.Estado;

@Component
public class DaoFactory {

	private static Session session;
	
	public DaoFactory(Session session) {
		this.session = session;

	}
	
	public static DaoImpl getDaoEstado()
	{
		return new DaoImpl<Estado>(session,Estado.class);
	}
		
}
estou com o seguinte erro:
11:32:42,343 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection
11:32:42,343 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
14/02/2010 11:32:44 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
	at smcv.dao.DaoImpl.adicionar(DaoImpl.java:23)
	at smcv.controller.EstadoController.adiciona(EstadoController.java:40)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:50)
	... 40 more
11:32:44,484 DEBUG SessionImpl:248 - opened session at timestamp: [telefone removido]
11:32:44,484 DEBUG JDBCTransaction:82 - begin
11:32:44,484 DEBUG ConnectionManager:444 - opening JDBC connection
11:32:44,484 DEBUG JDBCTransaction:87 - current autocommit status: false
gravando dados no banco
11:32:44,546 DEBUG JDBCTransaction:186 - rollback
11:32:44,546 DEBUG JDBCTransaction:197 - rolled back JDBC Connection
11:32:44,546 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection
11:32:44,546 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]

alguém sabe qual é o problema, e gostaria tambem de saber se essas implementações estão corretas se tem algo que eu poderia mudar, melhorar e etc.

vlw

9 Respostas

Lucas_Cavalcanti

no final da stacktrace:
[code]
Caused by: java.lang.NullPointerException
at smcv.dao.DaoImpl.adicionar(DaoImpl.java:23)
[code]

ou seja, vc tá passando uma session nula pro DaoImpl... tenta ver em que ponto a session deixou de ser passada pra frente...

C

Lucas

eu coloquei o comando

//System.out.println("session: "+ session!=null);

onde eu passo as sessions mas retornou tudo true, estou chamando o daoFactory assim

DaoFactory.getDaoEstado().adicionar(estado);

será que é isso? e esta aparecendo a seguinte mensagem de erro também

log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.
C

o controle de sessoes foi configurado para o vraptor fazer

<context-param>
    	<param-name>br.com.caelum.vraptor.provider</param-name>
    	<param-value>br.com.caelum.vraptor.util.hibernate.HibernateCustomProvider</param-value>
	</context-param>
Lucas_Cavalcanti

se a sua classe é estática (vc tá chamando DaoFactory.getXXDao()) o VRaptor não vai injetar dependências… se vc quiser usar o DaoFactory e aproveitar a injeção de dependências do VRaptor, vc tem que transformar tirar todos os statics dele e receber um DaoFactory no construtor do seu controller:

@Resource
public class MeuController {
   private DaoFactory factory;
   public MeuController(..., DaoFactory factory) {
       this.factory = factory;
   }
   //...
   public void adiciona(Abc abc) {
       //...
       this.factory.getAbcDao().adiciona(abc);
   }
}
C

ok Lucas, vlw pela dica, funcionou certinho, só uma perguta

eu posso usar assim:

@Resource
public class EstadoController {

	private Result result;
	
        private DaoImpl<Estado> dao; - defino a implementalção que eu quero
	
        private Validator validator;
	
	public EstadoController(Result result, Validator validator, DaoFactory factory)
	{
		this.result = result;
		this.validator = validator;
		

                this.dao = factory.getDaoEstado(); - instancio a implementação
	}

essa é uma boa forma de implementação ou não?

Lucas_Cavalcanti

é uma forma razoável… melhor seria ter a classe:

@Component
public class EstadoDao extends DaoImpl<Estado> {
     
     public EstadoDao(Session session) {
         super(session, Estado.class);
     }
}

e receber EstadoDao direto no construtor do controller…

Geralmente eu prefiro assim do que usar um daoFactory… com injeção de dependências não tem mais motivo pra ter o daoFactory…

C

ai neste caso eu faço uma implementação para cada classe extendendo DaoImpl?

Lucas_Cavalcanti

isso… porque em 90% dos casos vc precisa de um método específico para o dao de uma entidade… tipo listaUsuariosAtivos, listaProdutosEmEstoque e etc…

criar a classe a mais é melhor que ter um DaoFactory e ter que chamar o getXXDao toda hora… Se o problema era instanciar o Dao, o VRaptor já faz isso pra vc agora :wink:

Spool

Esta usando a injeção de dependências do VRaptor para controlar as instancias de Session?

Criado 14 de fevereiro de 2010
Ultima resposta 14 de fev. de 2010
Respostas 9
Participantes 3