Les emplacements de liaison EJB définis par l'utilisateur étaient ignorés dans la version antérieure de Liberty

Dans les versions Liberty antérieures à 20.0.0.12, les beans Enterprise JavaBeans (EJB) n'étaient liés qu'à l'espace de nom java:[scope]. Les beans EJB n'étaient pas liés à un espace de nom JNDI (Java Naming and Directory Interface) principal de serveur, ce qui signifie que vous ne pouviez pas définir les noms des liaisons JNDI. Les attributs de liaison EJB qui permettent de spécifier le nom JNDI dans WebSphere Application Server Traditional étaient ignorés dans Liberty.

Liberty ignorait les attributs de liaison EJB du fichier ibm-ejb-jar-bnd.xml ci-dessous.

Liberty ignorait les attributs de liaison EJB du fichier ibm-ejb-jar-bnd.xmi ci-dessous.

Cette règle marque tous les noms de liaison JNDI qui étaient ignorés dans les versions Liberty antérieures à 20.0.0.12. Si votre application utilise ces noms dans des recherches JNDI directes au lieu d'utiliser des références EJB, vous devez soit utiliser Liberty version 20.0.0.12 ou ultérieure soit modifier votre application.

Si vous utilisez des références EJB, la règle Changement de comportement pour les recherches de beans Enterprise JavaBeans dans les versions antérieures de Liberty marque les noms JNDI qui doivent être convertis dans l'espace de nom java: si vous utilisez une version Liberty antérieure à 20.0.0.12.

Si vous n'utilisez pas les références EJB et que vous utilisez une version Liberty antérieure à 20.0.0.12, il est recommandé soit d'utiliser une version plus récente de Liberty soit de créer une référence EJB qui utilise le même nom JNDI et définir la référence EJB binding-name sur le nom JNDI java:[scope]. Si vous n'ajoutez pas de référence JNDI, vous devez analyser la syntaxe de votre code Java pour utiliser ces noms JNDI et convertir le nom de la recherche en nom JNDI java:.


Exemple de migration d'EJB :

L'exemple suivant crée une référence EJB pour faciliter la migration des problèmes de recherche si vous utilisez une version Liberty antérieure à 20.0.0.12.

EJB référencé :

@Stateless
public class MyEJB implements MyEJBInterface {
public String sayHello(String name) {
return "Bonjour là" + nom + "." ;
}
}

Interface distante :

@Remote
public interface MyEJBInterface {
String sayHello(String name);
}

Exemples de référence EJB :

Vous trouverez ci-dessous des exemples de déclaration d'une référence EJB dans Liberty. 1a ou 1b est requis avec 2a, 2b, 3a ou 3b pour associer correctement un EJB à sa référence. Par exemple, les options recommandées sont 1a et 2b pour que la configuration soit aisée et aboutisse, mais si 1b est déclaré avec 3b, vous obtenez la même fonctionnalité qu'avec la configuration recommandée.

  1. La référence elle-même doit être déclarée à l'aide d'une annotation de la classe qui référence l'EJB, dans le fichier ejb-jar.xml ou web.xml.
    1. Annotation EJB :
      < span class="Code"> < span class= "JavaKeyword"> classe publique < /span> < span class="JavaType">TestServlet< /span> {
      @EJB(name="ejb/MyEJB")
      MyEJB myEjb;
      ....
      }

    2. ejb-jar.xml et web.xml :
      < span class="Code"> < ejb-ref>
      <ejb-ref-name>ejb /MyEJB</ejb-ref-name>
      <ejb-ref-type>Session</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-ref>

  2. Si l'EJB référencé se trouve dans la même application que sa référence, aucune entrée ibm-ejb-jar-bnd.xml ou ibm-web-bnd.xml n'est requise. L'une des étapes suivantes permet au conteneur d'EJB d'associer automatiquement l'EJB à sa référence s'ils se trouvent dans la même application :

    1. Si un seul bean de l'application implémente l'interface EJB distante, aucune configuration supplémentaire n'est requise.

    2. Si plusieurs beans de l'application implémentent l'interface EJB distante, l'élément beanName doit être ajouté à l'annotation @EJB. Si vous utilisez un fichier ejb-jar.xml ou web.xml, l'élément <ejb-link> doit être ajouté à l'élément <ejb-ref> existant. Les modifications apportées à 1a et 1b sont indiquées ici :
      < span class="Code"> < span class= "JavaKeyword"> classe publique < /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>Session</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-link>MyEJB</ejb-link>
      <ejb-ref>

  3. Si l'EJB référencé se trouve dans une application autre que celle de sa référence, l'une des étapes ci-après doit être effectuée pour ajouter une chaîne de recherche. Ces exemples illustrent les chaînes de recherche d'une application exécutée sur le même serveur :

    1. Ajoutez l'élément lookup à l'annotation @EJB. Si vous utilisez un fichier ejb-jar.xml ou web.xml, l'élément <lookup-name> doit être ajouté à l'élément <ejb-ref> existant. Les modifications apportées à 1a et 1b sont indiquées ici :
      < span class="Code"> < span class= "JavaKeyword"> classe publique < /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>Session</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
      <ejb-ref>

    2. Déclarez la liaison de référence dans le fichier ibm-ejb-jar-bnd.xml ou ibm-web-bnd.xml :
      < span class="Code"> < ejb-ref name="ejb/MyEJB"
      binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
      L'attribut lookup, lookup-name ou binding-name peut être éventuellement utilisé pour référencer des EJB dans la même application. Dans ce cas, la valeur peut être définie sur toute recherche d'EJB directe applicable décrite à la fin de cette page.

Vous trouverez ci-dessous la recherche de référence EJB finale :

< span class="Code"> < span class= "JavaKeyword"> classe publique < /span> TestEJBClient {
public static void main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB");
}
}

Trois options permettent également de rechercher directement un EJB, sans utiliser de référence EJB :

  1. Si un bean se trouve dans le même module que sa référence :
    < span class="Code"> < span class= "JavaKeyword"> classe publique < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
    }
    }

  2. Si un bean se trouve dans la même application que sa référence :
    < span class="Code"> < span class= "JavaKeyword"> classe publique < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

  3. Si la définition de bean doit être recherchée globalement sur le même serveur :
    < span class="Code"> < span class= "JavaKeyword"> classe publique < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

Pour plus d'informations sur l'utilisation des liaisons EJB, voir Utilisation des beans Enterprise JavaBeans avec des interfaces distantes dans Liberty et Présentation des liaisons d'applications EJB 3.0 et EJB 3.1.