No Liberty anterior à versão 20.0.0.12, os beans Enterprise JavaBeans (EJB) eram ligados apenas ao
namespace
java:[scope]. Os beans EJB não eram ligados ao namespace Java Naming and Directory Interface (JNDI) raiz de um servidor, ou seja, não era possível definir os nomes de ligação JNDI. Os atributos de ligação EJB que permitem
especificar o nome JNDI no WebSphere Application Server tradicional
eram ignorados no Liberty.
Os atributos de ligação EJB a seguir do arquivo ibm-ejb-jar-bnd.xml eram ignorados no Liberty.
session simple-binding-namesession component-idsession local-home-binding-namesession remote-home-binding-nameinterface binding-nameOs atributos de ligação EJB a seguir do arquivo ibm-ejb-jar-bnd.xmi eram ignorados no Liberty.
ejbBindings jndiNameEsta regra sinaliza todos os nomes de ligação JNDI que eram ignorados no Liberty antes da versão 20.0.0.12. Quando o aplicativo usa esses nomes em consultas diretas de JNDI, em vez de referências de EJB, deve-se usar o Liberty versão 20.0.0.12 ou mais recente ou modificá-lo.
Se você usar referências EJB, a regra Mudança de comportamento em consultas para Enterprise JavaBeans em versões anteriores do Liberty sinalizará quaisquer nomes JNDI que devam ser convertidos no namespace java: quando uma versão do Liberty anterior à 20.0.0.12 estiver sendo usada.
Se você não usar referências EJB e estiver usando uma versão do Liberty mais antiga que a 20.0.0.12, será recomendável usar uma versão mais recente do Liberty ou criar uma referência EJB com o mesmo nome JNDI e configurar a referência EJB binding-name
com o nome JNDI java:[scope]. Se você não incluir
uma referência EJB, deverá varrer seu código Java para uso desses nomes JNDI e
converter o nome de consulta no nome JNDI java:.
O exemplo a seguir cria uma referência EJB para ajudar a migrar quaisquer problemas de consulta quando você não está usando o Liberty versão 20.0.0.12 ou mais recente.
EJB referenciado:
|
@Stateless public class MyEJB implements MyEJBInterface { public String sayHello(String name) { return "Hello there " + name + "."; } } |
Interface remota:
|
@Remote public interface MyEJBInterface { String sayHello (nome da String ); } |
Os seguintes são exemplos de como declarar uma Referência EJB no Liberty. 1a ou 1b é necessário em conjunto com 2a, 2b, 3a ou 3b para vincular com êxito um EJB e sua referência. Por exemplo, as opções recomendadas são 1a e 2b para uma configuração fácil e bem-sucedida, mas se 1b for declarado em conjunto com 3b, você obterá a mesma funcionalidade que a configuração recomendada.
|
public class TestServlet { @EJB(name="ejb/MyEJB") MyEJB myEjb; .... } |
|
<ejb-ref> <ejb-ref-name>ejb/MyEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <ejb-ref> |
beanName
deverá ser incluído na anotação @EJB. Se estiver usando um ejb-jar.xml
ou um web.xml, o elemento <ejb-link> deverá ser incluído no elemento
<ejb-ref> existente. As modificações para 1a e 1b são mostradas aqui:|
public class TestServlet { @EJB(name="ejb/MyEJB" beanName="MyEJB") MyEJB myEjb; .... } |
|
<ejb-ref> <ejb-ref-name>ejb/MyEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <ejb-link> MyEJB </ejb-link> <ejb-ref> |
lookup na anotação @EJB. Se estiver usando um
ejb-jar.xml ou um web.xml, o elemento
<lookup-name> deverá ser incluído no elemento <ejb-ref> existente. As modificações para 1a e 1b são mostradas aqui:
|
public class TestServlet { @EJB(name="ejb/MyEJB" lookup="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface") MyEJB myEjb; .... } |
|
<ejb-ref> <ejb-ref-name>ejb/MyEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <lookup-name> java:global/MyAPP/moduleA/MyEJB! com.test.MyEJBInterface </lookup-name> <ejb-ref> |
|
<ejb-ref name="ejb/MyEJB" binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface"/> |
lookup, lookup-name ou binding-name pode, opcionalmente, ser usado
para referenciar EJBs no mesmo aplicativo. Nesse caso, o valor pode ser configurado para qualquer consulta EJB direta aplicável descrita no final desta página.
A seguir está a consulta de referência EJB final:
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB"); } } |
Como alternativa, há três opções para consultar um EJB diretamente, não usando uma referência EJB:
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface"); } } |
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface"); } } |
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface"); } } |
Para obter informações adicionais sobre como usar ligações EJB, veja Usando enterprise JavaBeans com interfaces remotas no Liberty e Visão geral de ligações de aplicativos EJB 3.0 e EJB 3.1.