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 :
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright © 2017 Daniel Dias
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<Context>
<Manager pathname=""/> <!-- disables storage of sessions across restarts -->
This file has been truncated. show original
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