Bom pessoal, encontrei um problemaão de performance que gostaria de ver com vcs do VRaptor como resolver...
O problema é que a Injeção de dependencia nos interceptors são feitas antes do método accept ser rodado.
E como o interceptor é criado sempre para toda requisição, mesmo quando você não aceita interceptar um método, os recursos já foram injetados e vc perde muita performance....
Exemplificando melhor, estou montando meu TransactionInterceptor, e o problema é que ele esta abrindo uma session e injetando no meu interceptor mesmo quando retorno false no método accept.
E desta forma paginas que deveriam só renderizar dados, e não fazer ligações ao banco de dados, estão atoa puxando uma sessão do hibernate...
Eu tenho anotações @Transaction que coloco nos meus @Resource quando quero rodalos sobre uma tranzação, e as sessões só deveriam ser injetadas nestas condições... =/ ....
quando abro uma logica que não tem conexão com o banco, que não pede nenhum DAO, por conta do interceptor uma sessão com Hibernate esta sendo aberta desnecessáriamente =/
como resolvo isso ??
uma solução seria testar o accept em um método estatico, o que dificultaria, pois não daria para implementar uma interface assim =/
um exemplo de recurso que não deveria abrir sessão com hibernate@Resource
public class IndexController {
@Path("/")
public void index() {
//como o interceptor roda antes deste método ser executado
//uma Session acaba sendo aberta atoa pelo Interceptor =/
}
}
um exemplo de recurso que deveria abrir sessão com o banco
@Resource
public class PessoaController {
private final PessoaDao pessoaDao;
public PessoaController(PessoaDao pessoaDao) {
this.pessoaDao = pessoaDao;
}
@Path("/pessoas")
@Get
public List<Pessoa> list() { //tranzação não é necessária
return pessoaDao.list();
}
@Path("/pessoas")
@Post
@Transaction
public Pessoa adicionar(Pessoa pessoa) { //aqui há um interceptor de tranzação
daoPessoa.persist(pessoa);
return pessoa;
}
@Path("/pessoas/{pessoa.id}")
@Post
@Transaction
public Pessoa atualizar(Pessoa pessoa) { //arqui há um interceptor de tranzação
pessoaDao.marge(pessoa);
return pessoa;
}
}
meu Interceptor...
@Intercepts
@RequestScoped
public class TransactionInterceptor implements Interceptor {
private final Session session;
public TransactionInterceptor(Session session) {
this.session = session;
}
public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) {
org.hibernate.Transaction transaction = null;
try {
transaction = session.beginTransaction();
stack.next(method, instance);
transaction.commit();
} finally {
if (transaction != null && transaction.isActive()) {
transaction.rollback();
}
}
}
public boolean accepts(ResourceMethod method) {
return method
.getMethod()
.isAnnotationPresent(Transaction.class);
}
}