Injeção de interface remota - EJB 3

2 respostas
L

Pessoal,

Estou com uma dúvida. Já procurei na especificação EJB3 e não encontrei a resposta. Se eu tenho um EJB e eu tentar injetar uma interface remota com @EJB, ela vai agir como uma interface local?

Ex:

@Stateless
public class TesteEJB implements ITesteRemote, ITesteLocal {
     @EJB private FabricaDAO fabricaDAO; //
     @EJB private IEmailLocal; 
     @EJB private IProjetoRemote; // isso vai funcionar como  se fosse uma chamada local?

    ....
}

@Remote
public interface IProjetoRemote {
   ...
}

@Local
public interface IEmailLocal {
   ...
}

A razão da pergunta é que eu não criei e nem preciso criar uma interface local (IProjetoLocal). Só que eu preciso dela injetada nesse EJB mas não queria ter que criar uma interface local só pra isso.

2 Respostas

paulo1911

Olá amigo
Quando eu me certifiquei em EJB 3.1, o que eu li na especificação e no livro EJB 3.1 6ª Ed. foi o seguinte.
EJB 3.1 tem a feature de EJB não precisar mais da interface remota quando for um EJB local, ou seja somente da sua app, recurso chamado EJB (no interface view), porém vc pode usar a mesma semantica IServicoLocal anotado como @Remote e a ServicoLocalImpl como @Stateless que mesmo assim nesse caso ele vai passar por valor serializado e nao por referencia como é o caso do no interface view.

Outro detalhe importante, é que o EJB remote tb funciona com injeção local o @Local nao pode ser injetado remotamente, já o @Remote pode tanto localmente quanto remotamente, conforme a especificação e o livro EJB 3.1 6ª Ed.

Vc pode testar isso criando um EJB remoto que recebe uma referencia e dentro do metodo do ejb vc altera os valores do objeto passado como referencia. Verificando que a referencia nao se alterou e seus valores tb nao.

Diferente do no interface view que vc anota como @statless e no mesmo contexto ele passa por referencia…
Na nova especificação existem umas particularidaes com relação a semantica dos EJBs locais e remotos com o no interface view
Obs.: eu so consegui efetuar alguns testes com o glassfish, JBoss 6 e 7 em web profile e final não rolaram em alguns casos, nao pesquisei sobre o assunto pra saber o motivo mas vale verificar isso…

fica a dica

L

Respondendo:

O container vai fazer uma chamada remota. Mesmo que o bean seja chamado da mesma VM, a partir de um Stateless Session Bean usando-se a anotação @EJB o container vai fazer uma chamada remota. Então terei mesmo que criar uma interface e anotá-la com @Local.

Obrigado

Criado 1 de agosto de 2012
Ultima resposta 2 de ago. de 2012
Respostas 2
Participantes 2