Faz um bom tempo que estou afastado do Java e resolvi voltar e montar uma aplicação com JSF 2.0, CDI, e a princípio usar o Tomcat.
Fiz toda a configuração do Tomcat e ele consegue injetar os recursos nos meus Managed Beans.
Só que eu tenho um Interceptor e ele não é chamado nunca. Abaixo o código dele:
Transactional.java
packagecom.tebosoftware.teboerp.cdi;importjava.io.Serializable;importjavax.inject.Inject;importjavax.interceptor.AroundInvoke;importjavax.interceptor.Interceptor;importjavax.interceptor.InvocationContext;importjavax.persistence.EntityManager;importjavax.persistence.EntityTransaction;/** * * @author Thales */@Interceptor@TransactionalpublicclassTransactionInterceptorimplementsSerializable{privatestaticfinallongserialVersionUID=1L;private@InjectEntityManagermanager;@AroundInvokepublicObjectinvoke(InvocationContextcontext)throwsException{EntityTransactiontrx=manager.getTransaction();booleancriador=false;try{if(!trx.isActive()){// truque para fazer rollback no que já passou// (senão, um futuro commit, confirmaria até mesmo// operações sem transação)trx.begin();trx.rollback();// agora sim inicia a transação trx.begin();criador=true;}returncontext.proceed();}catch(Exceptione){if(trx!=null&&criador){trx.rollback();}throwe;}finally{if(trx!=null&&trx.isActive()&&criador){if(trx.getRollbackOnly()){trx.rollback();}else{trx.commit();}}}}}
Como faz tempo que não trabalhava, tem algo errado ou é o tomcat que não consegue trabalhar com Interceptor?
no seu beans.xml deve ser declarado o seu interceptor conforme abaixo :
tebosoftware
Bom dia,
eu tinha adicionado no beans.xml o interceptor, mas mesmo assim não chamou.
O Manager Bean estava com @Named e no caso @RequestScoped e a classe que está mapeada com a anotação está marcado com @Inject para ser atribuída o MB e durante o debug eu vi que não entrou no método invoke do TransactionInterceptor .
Daniel_Dias
Ola ve se não esta faltando isso no seu projeto :
e poste o link do do seu projeto no github.
{ },s
tebosoftware
Boa noite, mesmo colocando o mesmo colocando o context do mesmo jeito que o seu não deu certo, a injeção da dependência funciona, mas não funciona o Interceptor.
<?xml version="1.0" encoding="UTF-8"?><Contextpath="/TeboERP"><ResourceLinkauth="Container"global="ds/TeboERP"name="ds/TeboERP"type="javax.sql.DataSource"/><Managerpathname=""/><!-- disables storage of sessions across restarts --><Resourcename="BeanManager"auth="Container"type="javax.enterprise.inject.spi.BeanManager"factory="org.jboss.weld.resources.ManagerObjectFactory"/></Context>
aparentemente não achei nada fora do normal no seu projeto.
da uma olhada nesse projeto e compare com o seu e ve aonde esta errando ou faltando algo :
tebosoftware1 like
Obrigado pela ajuda Daniel, depois de comparar tudo, encontrei que era o pom que estava com o weld-servlet ao invés do weld-servlet-core que estava no seu .
Muito obrigado pela ajuda.