EJB + Herança

10 respostas
rodpuc

Queria usar herança com EJB… andei pesquisando por aí e encontrei pouca coisa sobre isso, algumas discussões antigas em fóruns diziam que não é possível, mas não sei se isso ainda se aplica… é isso msm, n dá e ponto? Se não dá, qual seria a solução para o meu caso?

Explicando melhor a minha necessidade:
Meu projeto B tem um EJB que deve fornecer serviços iguais aos de um outro EJB localizado em meu projeto A. Em alguns casos os serviços são mais específicos, então teriam de sobrescrever os herdados. Uso o maven para gerenciar as dependencias.

10 Respostas

thiago.correa

Não tem como mesmo, pois é em cima do objeto instanciado que será definido qual implementação será chamada.

rodpuc

Como eu poderia fazer então?

thiago.correa

Se você tem um caso de uso em que são chamadas duas “rotinas” ou mais, você pode fazer com que o teu EJB faça a chamada para os demais EJBs.

rodpuc

Mas dessa forma qualquer alteração feita no EJB “pai” não seria refletida no EJB “filho”… isso não seria muito legal.

Talvez se eu colocasse uma outra interface… e se obrigasse minhas interfaces @Local a implementarem ela… será que daria certo?

thiago.correa

A interface @Local só vai dizer que aquele método está disponível para acesso local, nada mais!!!

Só se você fizer um Factory de EJB, se é que isso existe!!!

P

Estamos falando de EJB3? Se for, pode usar herança, sem problemas. Tanto nas entidades (pojos) como nos session beans.

rodpuc

EJB3 sim… vou tentar então!

P

Só para esclarecer melhor, segue o trecho da especificação EJB 3.


The session bean class may have superclasses and/or superinterfaces. If the session bean has
superclasses, the business methods, lifecycle callback interceptor methods, the timeout callback
method, the methods of the optional SessionSynchronization interface, the
Init or ejbCreate methods, the Remove methods, and the methods of the
SessionBean interface, may be defined in the session bean class, or in any of its superclasses.
A session bean class must not have a superclass that is itself a session bean class.

Vendo o teu caso, talvez precise mudar tua hierarquia de classes. Mas antes disso faça o teste, alguns containers apenas ignoram se o teu ejb “pai” for stateless/statefull, e sobrescrevem com o novo tipo definido no ejb “filho”. Posta o resultado do teste.

Obs.: parece que a partir da 3.1, isso já é possível, sem restrições.

Alexandre_Saudate

Faça injeção de um EJB em outro , sobrescreva os métodos e, dependendo do caso, você chama (ou não) o outro EJB (Delegate).

rodpuc

Já deram essa sugestão… mas

Criado 9 de dezembro de 2009
Ultima resposta 9 de dez. de 2009
Respostas 10
Participantes 4