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-name
session component-id
session local-home-binding-name
session remote-home-binding-name
interface binding-name
Os atributos de ligação EJB a seguir do arquivo ibm-ejb-jar-bnd.xmi
eram ignorados no Liberty.
Esta 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:.
Exemplo de Migração EJB:
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 "Olá lá" + nome + ".";
}
}
Interface remota:
@Remote
public interface MyEJBInterface {
String sayHello (nome da String );
}
Exemplos de referência EJB:
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.
- A própria referência deve ser declarada usando uma anotação dentro da classe que referencia o EJB,
no ejb-jar.xml ou no web.xml.
- Anotação EJB:
< span class="Code"> < span class= "JavaKeyword"> classe pública < /span> < span class="JavaType">TestServlet< /span> {
@EJB(name="ejb/MyEJB")
MyEJB myEjb;
....
}
- ejb-jar.xml e web.xml:
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb /MyEJB</ejb-ref-name>
<ejb-ref-type>Sessão</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<ejb-ref>
- Se o EJB referenciado estiver no mesmo aplicativo que sua referência, uma entrada ibm-ejb-jar-bnd.xml ou
ibm-web-bnd.xml não será necessária. Uma das etapas a seguir permitirá que o Contêiner EJB
vincule automaticamente o EJB e sua referência se eles estiverem no mesmo aplicativo:
- Se apenas um bean no aplicativo implementar a interface EJB remota, nenhuma configuração adicional será necessária.
- Se vários beans no aplicativo implementarem a interface EJB remota, o elemento
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:
< span class="Code"> < span class= "JavaKeyword"> classe pública < /span> TestServlet {
@EJB(name="ejb/MyEJB" beanName="MyEJB")
MyEJB myEjb;
....
}
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb /MyEJB</ejb-ref-name>
<ejb-ref-type>Sessão</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<ejb-link>MyEJB</ejb-link>
<ejb-ref>
- Se o EJB referenciado estiver em um aplicativo diferente de sua referência, uma das etapas a seguir deverá ser concluída para incluir uma sequência de consulta.
Esses exemplos mostram sequências de consulta para um aplicativo em execução no mesmo servidor:
- Inclua o elemento
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:
< span class="Code"> < span class= "JavaKeyword"> classe pública < /span> TestServlet {
@EJB(name="ejb/MyEJB" lookup="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface")
MyEJB myEjb;
....
}
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb /MyEJB</ejb-ref-name>
<ejb-ref-type>Sessão</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
<ejb-ref>
- Declare a ligação de referência no ibm-ejb-jar-bnd.xml ou no ibm-web-bnd.xml:
< span class="Code"> < ejb-ref name="ejb/MyEJB"
binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
O atributo 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:
< span class="Code"> < span class= "JavaKeyword"> classe pública < /span> 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:
- Quando um bean estiver no mesmo módulo que sua referência:
< span class="Code"> < span class= "JavaKeyword"> classe pública < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
}
}
- Quando um bean estiver no mesmo aplicativo que sua referência:
< span class="Code"> < span class= "JavaKeyword"> classe pública < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
- Quando a definição de bean precisar estar localizada globalmente dentro do mesmo servidor:
< span class="Code"> < span class= "JavaKeyword"> classe pública < /span> 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.