Interceptor no CDI não é invocado no Managed Bean (EJB + CDI + JSF 2 + JBoss 7.1.1)

5 respostas
D

E ae galera, blz?

Estou com um problema que não consegui resolver, muito menos entender o motivo de estar ocorrendo. Vamos ao cenário:

Eu tenho um classe ClienteModel, que é um EJB:

@Stateless
public class ClienteModel extends AbstractModel {

    @Inject
    private ClienteDAO clienteDAO;

    @Interceptors(AuditoriaInterceptor.class)
    public Cliente incluir(Cliente cliente) throws Exception {
        clienteDAO.incluir(cliente);
        return cliente;
    }

}

Este EJB está anotado para utilizar o interceptor AuditoriInterceptor:

public class AuditoriaInterceptor {

    @AroundInvoke
    public Object intecept(InvocationContext invocation) throws Exception {
        System.out.println("******************** AUDIT ");

        try {
            return invocation.proceed();
        } catch (Exception e) {
            throw e;
        }
    }
}

Criei uma classe abstrata CrudMB que possui alguns métodos básicos:

public abstract class CrudMB<T> {
    private T bean;

    public T getBean() {
        return bean;
    }

    public void setBean(T bean) {
        this.bean = bean;
    }

    public abstract AbstractModel<T> getModel();

    public String incluir() {
        try {
            getModel().incluir(getBean()); // interceptor não executa
            addMessage(null, "Inclusão realizada com sucesso");
            return "pesquisa";
        } catch (CorreiosException e) {
            addError(null, e.getKey());
        }

        return null;
    }
}

Então implementei o meu MB:

@ViewScoped
@ManagedBean
public class ClienteMB extends CrudMB<Cliente> {

    @PostConstruct
    public void init() {
        setBean(new Cliente());
    }

    @Inject
    private ClienteModel clienteModel;

    public ClienteModel getModel() {
        return clienteModel;
    }
}

O interceptor não está sendo chamado quando o método incluir do meu MB é acionado pelo xhtml. O curioso é que se eu copiar o código da classe CrudMB para a classe ClienteMB, o interceptor é chamado:

@ViewScoped
@ManagedBean
public class ClienteMB extends CrudMB<Cliente> {
    @Inject
    private ClienteModel clienteModel;

    public ClienteModel getModel() {
        return clienteModel;
    }

    @Override
    public String incluir() {
        try {
            getModel().incluir(getBean()); // interceptor executa
            addMessage(null, "Inclusão realizada com sucesso");
            return "pesquisa";
        } catch (CorreiosException e) {
            addError(null, e.getKey());
        }

        return null;
    }
}

Eu sei que existe outra forma de fazer um interceptor utilizando o CDI, porém não posso modificar o interceptor atual.

Alguém já passou por este problema?

5 Respostas

H

Tente trocar de @ViewScoped para @SessionScoped e veja c vai.

Tome cuidado para importar o SessionScoped do CDI e não do ManagedBeans.

ViewScoped não é do CDI.

D

Hebert Coelho:
Tente trocar de @ViewScoped para @SessionScoped e veja c vai.

Tome cuidado para importar o SessionScoped do CDI e não do ManagedBeans.

ViewScoped não é do CDI.

Testei os dois SessionScoped (CDI e JSF) e não funcionou.

H

diegodrumond:
Hebert Coelho:
Tente trocar de @ViewScoped para @SessionScoped e veja c vai.

Tome cuidado para importar o SessionScoped do CDI e não do ManagedBeans.

ViewScoped não é do CDI.

Testei os dois SessionScoped (CDI e JSF) e não funcionou.

Agora com tudo CDI, faz mais um teste? Tira o MB do genérico?

D

Hebert Coelho:
diegodrumond:
Hebert Coelho:
Tente trocar de @ViewScoped para @SessionScoped e veja c vai.

Tome cuidado para importar o SessionScoped do CDI e não do ManagedBeans.

ViewScoped não é do CDI.

Testei os dois SessionScoped (CDI e JSF) e não funcionou.

Agora com tudo CDI, faz mais um teste? Tira o MB do genérico?

Eu já tentei marcar o MB com @javax.inject.Named e @javax.enterprise.context.SessionScoped.SessionScoped mesmo assim não funcionou.

R

já tentou usar:

@Interceptors(AuditoriaInterceptor.class)  
    @Stateless  
    public class ClienteModel extends AbstractModel {  
      
        @Inject  
        private ClienteDAO clienteDAO;  
      
        
        public Cliente incluir(Cliente cliente) throws Exception {  
            clienteDAO.incluir(cliente);  
            return cliente;  
        }  
      
    }
Criado 5 de fevereiro de 2013
Ultima resposta 28 de mar. de 2013
Respostas 5
Participantes 3