VRaptor: Controller + Service + GenericDAO

Bom dia,

Estou em dúvida de como utilizar um Generic Dao no Vraptor, pois criei as seguintes classes;

Interface GenericDao

public interface GenericDao<E,K> {
void add(E entity) ;
void saveOrUpdate(E entity) ;
void update(E entity) ;
void remove(E entity);
E find(K key);
List getAll() ;
}
Implementação do GenericDao

public abstract class GenericDaoImpl<E, K extends Serializable> implements GenericDao<E, K> {

protected final Session session;
protected final Class<E> clazz;
protected Class<? extends E> daoType;
private Transaction tx;

@SuppressWarnings("unchecked")
protected GenericDaoImpl(Session session) {
    this.session = session;
    this.clazz = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

    Type t = getClass().getGenericSuperclass();
    ParameterizedType pt = (ParameterizedType) t;
    daoType = (Class) pt.getActualTypeArguments()[0];
}

@Override
public void add(E entity) {
    this.tx = this.session.beginTransaction();
    this.session.persist(entity);
    this.session.flush();
    this.tx.commit();
}

@Override
public void saveOrUpdate(E entity) {
    this.tx = this.session.beginTransaction();
    this.session.merge(entity);
    this.session.flush();
    this.tx.commit();
}

@Override
public void update(E entity) {
    this.tx = this.session.beginTransaction();
    this.session.merge(entity);
    this.session.flush();
    this.tx.commit();
}

@Override
public void remove(E entity) {
    this.tx = this.session.beginTransaction();
    this.session.delete(entity);
    this.tx.commit();
}

@Override
public E find(K key) {
    return null; 
}

@Override
public List<E> getAll() {
    return null; 
}

}
Para cada modelo vou criar uma interface como a seguinte;

Interface PacoteDao

public interface IPacoteDao extends GenericDao<Pacote, Integer>{
void alterarSituacao(Long pacoteId, Pacote.PacoteSituacao situacao);
void removerAgendamento(Agendamento agendamento, Boolean remover, HistoricoAcesso log);
Long contarAgendamentosPendentes(Unidade unidade, LocalDate startDate, LocalDate endDate);
Long contarPorSituacao(Unidade unidade, Pacote.PacoteSituacao situacao);
Long contarFinalizamNoPeriodo(Unidade unidade, LocalDate startDate, LocalDate endDate);
List listar(Unidade unidade, Boolean novos, Boolean concluidos,
Boolean cancelados, LocalDate periodoInicio, LocalDate periodoFim);

}
Implementação PacoteDao

public class PacoteDaoImpl extends GenericDaoImpl<Pacote, Integer>
implements IPacoteDao {

protected PacoteDaoImpl(Session session) {
    super(session);
}

@Override
public void alterarSituacao(Long pacoteId, Pacote.PacoteSituacao situacao) {}    
@Override
public void removerAgendamento(Agendamento agendamento, Boolean remover, HistoricoAcesso log) {}

@Override
public Long contarAgendamentosPendentes(Unidade unidade, LocalDate startDate, LocalDate endDate) {}

@Override
public Long contarPorSituacao(Unidade unidade, Pacote.PacoteSituacao situacao) {}

@Override
public Long contarFinalizamNoPeriodo(Unidade unidade, LocalDate startDate, LocalDate endDate) {}

@Override
public List<PacoteView> listar(Unidade unidade, Boolean novos, Boolean concluidos, Boolean cancelados, LocalDate periodoInicio, LocalDate periodoFim) {}

}
Quando eu incluo a anotação @Component na classe PacoteDaoImpl ocorre um erro ao rodar o projeto. Como é a primeira vez que implemento o uso de GenericDao no Vraptor, estou com dificuldades para implementá-lo.

A minha idéia é dividir os escopos; Controller --> Service --> Dao.

Conto com a ajuda!

Sem dizer o erro vai ficar difícil alguem te ajudar. VRaptor é independente de padrão de persistencia.

No projeto atual não uso o GenericDao, e para cada modelo DAO eu uso a anotação @Component, mas quando anoto na classe que usa o GenericDao retorna um erro. Eu tentei pegar um exemplo para o VRaptor com GenericDao, mas não encontrei.

Esse é o erro que o console me retorna.

10:34:12,441 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor PendingTasksInterceptor
Jan 05, 2018 10:34:12 AM org.apache.catalina.core.StandardWrapperValve invoke
10:34:12,459 DEBUG [TaskLogger ] Task TaskOrcamentoController.enviaLembretes was successfully scheduled. Trigger Expression Cron: 0 0 4 ? * *
10:34:12,459 DEBUG [TaskLogger ] Task TaskOrcamentoController.enviaLembretes was successfully scheduled. Trigger Expression Cron: 0 0 4 ? * *
GRAVE: Servlet.service() for servlet [jsp] in context with path [] threw exception
java.util.ConcurrentModificationException
10:34:12,459 DEBUG [TaskLogger ] Task TaskOrcamentoController.enviaLembretes was successfully scheduled. Trigger Expression Cron: 0 0 4 ? * *
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
10:34:12,459 DEBUG [TaskLogger ] Task TaskOrcamentoController.enviaLembretes was successfully scheduled. Trigger Expression Cron: 0 0 4 ? * *
at java.util.HashMap$EntryIterator.next(Unknown Source)
at java.util.HashMap$EntryIterator.next(Unknown Source)
at br.com.caelum.vraptor.tasks.jobs.request.PendingTasksInterceptor.schedulePendingTasks(PendingTasksInterceptor.java:52)
at br.com.caelum.vraptor.tasks.jobs.request.PendingTasksInterceptor.intercept(PendingTasksInterceptor.java:41)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:93)
at br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:82)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Sourc

Posta a classe com problema, que usa o GenericDao.

Vi agora que tinha postado no início. Veja se essas dicas ajudam:


Senao, tente ver diretamente com os desenvolvedores do VRaptor, pois é um framework pouco usado e vai ter dificuldades mesmo em encontrar soluções prontas.