Polimorfismo com EJB3

Galera, como eu posso utilizar a mesma interface em componentes EJB’s diferentes?

Tipo, tenho uma interface remota implementada em dois Beans diferentes, porém quando vou fazer a injeção faço:

@EJB
InterfaceRemota bean;

Como o container vai saber qual bean injetar se ambos implementam a mesma interface?

Tem como fazer ou a interface na tecnologia EJB é só para estabelecer um contrato?

Vlw

Você não deveria passar o nome do bean na hora do lookup?

@EJB(mappedName=“MeuBean”)
InterfaceDoBean ref;

Dessa forma você pode utilizar a mesma interface para N beans, pois o lookup é de um bean específico.

Eu nunca testei, mas tenta usar o atributo beanName do @EJB

algo assim

@EJB(name="blablabla",beanName="YourComponentBean")

Depois nos avise se funcionou :slight_smile:

Acredito que assim funcione…

 @EJB(name="Nome" mappedName="MeuBean")
 InterfaceDoBean bean;

Pois vc define um nome e o mapeamento para qual bean vc quer…

Falow !!!

Testei e não funcionou. :frowning:

Como devo configurar o EJB? @Stateless sem nada? Ou posso definir um JNDI? Ou teria que ter um JNDI para cada componente (bean)?

Exemplo:

@Stateless(name = "TesteInterfaceRemota"
public class TesteInterfaceRemota implements InterfaceRemota {}

@Stateless(name = "Teste2InterfaceRemota"
public class Teste2InterfaceRemota implements InterfaceRemota {}

Aí:

@EJB(name = "TesteInterfaceRemota")
InterfaceRemota teste;


@EJB(name = "Teste2InterfaceRemota")
InterfaceRemota teste2;

Pelo que eu sei, o atributo mappedName não é padrão para todos os servidores, ou seja, o comportamento pode ser diferente dependendo do servidor.

Usando o beanName funcionou comigo (testei apenas no Websphere 6.1).

A inteface:

package stateless;

public interface Test {	
	public void doSomeStuff();
}

Primeira implementação

package stateless;

import javax.ejb.Stateless;

@Stateless
public class TestBean implements Test {
	public void doSomeStuff() {		
		System.out.println("############### TEST BEAN ######################");
	}
}

Segunda implementação

package stateless;

import javax.ejb.Stateless;

@Stateless
public class TestBean2 implements Test {
	public void doSomeStuff() {
		System.out.println("************* TEST BEAN 2 ***************");
	}
}

Chamando os components

public class TestServlet extends javax.servlet.http.HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB(beanName="TestBean")
	private Test test;
	
	@EJB(beanName="TestBean2")
	private Test test2;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		test.doSomeStuff();
		test2.doSomeStuff();
		response.sendRedirect("index.jsp");
	}
}

Saída

[6/18/08 15:29:37:700 BRT] 0000002a SystemOut     O ############### TEST BEAN ######################
[6/18/08 15:29:37:700 BRT] 0000002a SystemOut     O ************* TEST BEAN 2 ***************

Aqui funcionou :wink:

[quote=ManchesteR]Pelo que eu sei, o atributo mappedName não é padrão para todos os servidores, ou seja, o comportamento pode ser diferente dependendo do servidor.
[/quote]

Na verdade ele se referencia ao ‘global JNDI name’, logo é bem provável que ele seja diferente para cada AS(Bean/remote, java:Bean, etc).

Aew ManchesteR

Estou usando OC4J como Container. Vou testar aqui e volto para falar se deu certo.

Vlw.