Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Interceptor com ejb-jar.xml não funciona

Boa tarde,

Notei que apenas o interceptor binding está funcionando tanto pra método como pra classe. Quando uso ejb-jar.xml não funciona no Wildfly. O interessante é que não dá erro nenhum. Tentei mudar * para o nome do meu ejb dao sem sucesso também. Tentei colocar o ejb-jar.xml tanto no WEB-INF coo no META-INF sem sucesso.

Segue alguns arquivos do projeto:

<!--EJB JAR-->
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">

    <interceptors>
        <interceptor>
            <interceptor-class>
                br.com.caelum.livraria.infra.LogInterceptor
            </interceptor-class>
        </interceptor>
    </interceptors>

    <assembly-descriptor>
        <interceptor-binding>
            <ejb-name>*</ejb-name>
            <interceptor-class>
                br.com.caelum.livraria.infra.LogInterceptor
            </interceptor-class>
        </interceptor-binding>
    </assembly-descriptor>
</ejb-jar>

<!--beans.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all">
</beans>
-----------------------------------------------------------------------
package br.com.caelum.livraria.infra;

import org.apache.commons.lang3.time.StopWatch;

import javax.annotation.Priority;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import java.util.concurrent.TimeUnit;

@Interceptor
@Cronometravel
@Priority(Interceptor.Priority.APPLICATION)
public class LogInterceptor {

    @AroundInvoke
    public Object logarTempoMetodo(InvocationContext invocationContext) throws Exception {
        StopWatch stopWatch = StopWatch.createStarted();
        Object result = invocationContext.proceed();
        stopWatch.stop();
        long time = stopWatch.getTime(TimeUnit.MILLISECONDS);
        String methodName = invocationContext.getMethod().toString();
        System.out.printf("===================================================================================================================\n");
        System.out.printf("Tempo decorrido do %s foi %d milisegundos.\n", methodName, time);
        System.out.printf("===================================================================================================================\n");

        return result;
    }
}

-----------------------------------------------------------------------
package br.com.caelum.livraria.infra;

import javax.interceptor.InterceptorBinding;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PACKAGE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Cronometravel {}

-----------------------------------------------------------------------
package br.com.caelum.livraria.dao;

import java.util.List;

import br.com.caelum.livraria.infra.Cronometravel;
import br.com.caelum.livraria.modelo.Autor;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import static javax.ejb.TransactionAttributeType.MANDATORY;
import static javax.ejb.TransactionAttributeType.SUPPORTS;

@Stateless
public class AutorDao {

    @Inject
    private EntityManager em;

    @PostConstruct
    void aposCriacao() {
        System.out.println("[INFO] AutorDao foi criado.");
    }

    @TransactionAttribute(MANDATORY)
    public void salva(Autor autor) {
        System.out.println("[INFO] Salvando o Autor " + autor.getNome());

        em.persist(autor);
        System.out.println("[INFO] Salvou o novo Autor: " + autor.getNome());
    }

    @PreDestroy
    void destruindoEjb() {
        System.out.println("[INFO] AutorDao foi destruido de novo.");
    }


    @TransactionAttribute(SUPPORTS)
    public List<Autor> todosAutores() {
        return em.createNamedQuery("Autor.listarTodos", Autor.class)
                .getResultList();
    }

    @TransactionAttribute(SUPPORTS)
    public Autor buscaPelaId(Integer autorId) {
        Autor autor = em.find(Autor.class,autorId);
        return autor;
    }
}
3 respostas

Oi Felipe,

Realmente nao estou vendo o problema. Para mim o ejb-jar.xml parece ok!

Uma ideia seria nao usar o CDI e deixar apenas as anotações/xml do mundo EJB para não misturar os dois containers, mas é um chute apeans.

abs

Oi Felipe,

Talvez o servidor esteja mapeando seu interceptor como sendo do CDI.

Tente declará-lo então no seu arquivo beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all">

<interceptors>
  <class>br.com.caelum.livraria.infra.LogInterceptor</class>
</interceptors>
</beans>

Abs.

solução!

E aí galera blz?

Funcionou. Na verdade vi que dentro do servidor (Wildfly) tinha War exploded (que era o do projeto atual) e tinha um War com uma versão anterior do mesmo projeto. Ao deletar essar war antigo funcionou.