Erro ao enviar um bean CDI como parametro de uma chamada EJB remota

2 respostas
D

Posso enviar um bean CDI como parametro de um método EJB remoto?
Estou tentando enviar um POJO como parametro de um EJB remoto e dentro deste POJO tem um bean CDI.
Porém na hora que o EJB vai desserializar o POJO da erro de ClassNotFoundException na classe com.mycompany.portalcarweb.client.model.User$Proxy$_$$_WeldClientProxy (que é o proxy CDI de um bean)

Segue meus códigos

LoggedUserProducer.java que é um Producer para um Usuario do banco de dados

public class LoggedUserProducer {

    @Produces
    @SessionScoped
    @LoggedUser
    public User produceLoggedUser() throws Exception {
        ... //carrego meu usuário do banco de dados por uma token do request
        
        return user;
    }
}

Minha JSF Controller que faz a chamada EJB remota:

CarController.java

@Named
@ViewScoped
public class CarController implements Serializable {

    @Inject
    private AuditRemote auditRemote; //Meu EJB remoto

    @Inject
    @LoggedUser
    private User loggedUser; //Meu User produzido pelo LoggedUserProducer

    public void repairCar() throws Exception {
        ... //algumas ações...

        AuditAction action = new AuditAction()
        action.setPerformedBy(loggedUser); //setando meu bean injetado (que é um proxy cdi) dentro de um POJO

        auditRemote.audit(action); //faço a chamada EJB passando a POJO. Aqui acontece a ClassNotFoundException;
    }

A Exception:

Eu não sei porque meu EJB não encontra a classe com.mycompany.portalcarweb.client.model.User$Proxy$_$$_WeldClientProxy.

Meu User.java está num jar que está como módulo do JBoss 7.
Se eu envio um o USer via new (e não injetado), tudo funciona normalmente. Imagino porque é a classe pura sem estar encapsulada por um proxy do weld. Mas se meu EJB conhece a User.java e o JBoss conhece as classes do Weld, não entendo porque não consegue deserializar um proxy de User.

Obrigado

2 Respostas

brunoborges

Quando você tem um bean injetado por CDI, de fato não é um bean, mas um proxy.

Por isso, você não pode enviar beans do CDI remotamente desta forma.

Dito isso, agora pergunto: porquê você quer enviar o bean ?

D

eu recebo o usuário logado via @Inject e em algumas operações tenho que informar quem executou tal operação.

No próprio exemplo acima (que é apenas um exemplo):
Numa oficina de carro o mecânico registra um reparo que o responsável pelo reparo é o próprio mecânico (que está logado) que cujo objeto veio via @Inject

Criado 25 de abril de 2013
Ultima resposta 6 de mai. de 2013
Respostas 2
Participantes 2