[Resolvido]Tomcat com CDI e Interceptor

Bom dia pessoal

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

package com.tebosoftware.teboerp.cdi;

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

/**
 *
 * @author Thales
 */
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Transactional {
}

TransactionInterceptor.java

package com.tebosoftware.teboerp.cdi;

import java.io.Serializable;
import javax.inject.Inject;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

/**
 *
 * @author Thales
 */
@Interceptor
@Transactional
public class TransactionInterceptor implements Serializable {

    private static final long serialVersionUID = 1L;
    private @Inject
    EntityManager manager;

    @AroundInvoke
    public Object invoke(InvocationContext context) throws Exception {
        EntityTransaction trx = manager.getTransaction();
        boolean criador = 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;
            }
            return context.proceed();
        } catch (Exception e) {
            if (trx != null && criador) {
                trx.rollback();
            }
            throw e;
        } 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?

desde já agradeço

Ola,

no seu beans.xml deve ser declarado o seu interceptor conforme abaixo :

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 .

Ola ve se não esta faltando isso no seu projeto :

e poste o link do do seu projeto no github.

{ },s

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.

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" version="1.1">
    <interceptors>
        <class>com.tebosoftware.teboerp.cdi.TransactionInterceptor</class>
    </interceptors>
</beans>

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/TeboERP">
    <ResourceLink auth="Container" global="ds/TeboERP" name="ds/TeboERP" type="javax.sql.DataSource"/>
    <Manager pathname=""/> <!-- disables storage of sessions across restarts -->
    <Resource name="BeanManager"
      auth="Container"
      type="javax.enterprise.inject.spi.BeanManager"
      factory="org.jboss.weld.resources.ManagerObjectFactory"/>
</Context>

EstadoCrud.java

package com.tebosoftware.teboerp.crud;

import com.tebosoftware.teboerp.cdi.Transactional;
import com.tebosoftware.teboerp.model.Estado;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

/**
 *
 * @author thales
 */
@RequestScoped
public class EstadoCrud {

    @Inject
    private EntityManager entityManager;

    @Transactional
    public void inserir(Estado estado) {
        entityManager.persist(estado);
        entityManager.flush();
    }

    @Transactional
    public void atualizar(Estado estado) {
        entityManager.persist(entityManager.merge(estado));
        entityManager.flush();
    }

    @Transactional
    public void remover(Estado estado) {
        entityManager.remove(entityManager.merge(estado));
        entityManager.flush();
    }

    public Estado buscar(String sigla) {
        return entityManager.find(Estado.class, sigla);
    }

    public List<Estado> listar(String sigla, String descricao) {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Estado> cq = cb.createQuery(Estado.class);
        Root<Estado> r = cq.from(Estado.class);
        cq.select(r);
        List<Predicate> where = new ArrayList<>();
        if (sigla != null && !sigla.isEmpty()) {
            where.add(cb.like(cb.upper(r.get("sigla")), sigla.toUpperCase()));
        }
        if (descricao != null && !descricao.isEmpty()) {
            where.add(cb.like(cb.upper(r.get("descricao")), descricao.toUpperCase()));
        }
        if (!where.isEmpty()) {
            cq.where(where.toArray(new Predicate[]{}));
        }
        cq.orderBy(cb.asc(r.get("descricao")));
        return entityManager.createQuery(cq).getResultList();
    }
}

EdicaoEstadoMB.java

package com.tebosoftware.teboerp.managerBean;

import com.tebosoftware.teboerp.crud.EstadoCrud;
import com.tebosoftware.teboerp.model.Estado;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

/**
 *
 * @author thales
 */
@Named
@RequestScoped
public class EdicaoEstadoMB implements Serializable {

    @Inject
    private EstadoCrud crud;
    private boolean novoEstado = true;
    private String sigla;
    private Estado estado;

    public String getSigla() {
        return sigla;
    }

    public void setSigla(String sigla) {
        this.sigla = sigla;
    }

    public Estado getEstado() {
        if (estado == null) {
            estado = new Estado();
        }
        return estado;
    }

    public void setEstado(Estado estado) {
        this.estado = estado;
    }

    public void inicializar() {
        if (sigla == null || sigla.isEmpty()) {
            estado = null;
            novoEstado = true;
        } else {
            estado = crud.buscar(sigla);
            novoEstado = estado == null;
        }
    }
    
    public void gravar() {
        if (novoEstado) {
            crud.inserir(estado);
            estado = new Estado();
        } else {
            crud.atualizar(estado);
        }
        FacesMessage msg = new FacesMessage("Gravado");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}

Este é o meu pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tebosoftware</groupId>
    <artifactId>TeboERP</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>TeboERP</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.2.17</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.2.17</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.6.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.3.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet</artifactId>
            <version>1.1.34.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>6.2</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces.extensions</groupId>
            <artifactId>all-themes</artifactId>
            <version>1.0.8</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

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 :

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.

1 curtida

show de bola.

bons estudos .

1 curtida