3

J'ai une application d'entreprise A et B déployée (en WLS 10.0). A est le "framework", B est une application client. Le client émet les appels suivants:Besoin d'aide pour comprendre JNDI et une exception ClassCastException particulière dans J2EE

Object o = ctx.lookup(jndiName); // line 1 
cf = (ConnectionFactory) o; // line 2 

ConnectionFactory est une interface, définie comme:

public interface ConnectionFactory 
    extends java.io.Serializable, javax.resource.Referenceable { 
    ... 
} 

Ce qui se passe est:

  1. Si le pot contenant la classe d'interface est sur la classpath du système, la ligne 2 est exécutée correctement
  2. Si la classe d'interface n'est pas sur le chemin d'accès au système du système, mais est h les applications séparément, la ligne 2 lève une exception ClassCastException (qui a le texte informatif que o est un ConnectionFactoryImpl)

Pourquoi est-ce possible? Je suppose que la recherche JNDI renvoie seulement un talon à l'objet distant (ai-je raison à ce point?), Alors pourquoi est-ce important que le classloader de la classe d'interface soit différent?

Le genre de réponse que j'attendre:

  1. Oui, il devrait se produire la façon dont vous l'expérience, parce que ...
  2. Non, il ne devrait pas se produire de cette façon, parce que si ... alors ..., donc il y a quelque chose de louche dans votre configuration
  3. La situation que vous avez décrite est très étrange, êtes-vous sûr de ne pas manquer quelque chose quelque part?
  4. ... :)

Il serait également bien si quelqu'un pourrait expliquer comment le JNDI et les talons de travail, d'où vient la coulée se produit (sur le côté client sur le talon, ou sur l'objet original sur le côté à distance?), etc.

Merci pour votre aide!

Répondre

2

La réponse, malheureusement, est (1). JNDI ne dicte pas un mécanisme pour la façon dont l'objet est stocké sur l'arbre ou comment il est livré aux clients. C'est juste une API à utiliser pour effectuer les opérations. Si les deux applications se trouvent dans la même machine virtuelle Java, comme c'est le cas ici, alors Weblogic transmet très probablement l'objet directement à l'application cliente. Il n'y a pas de bout, et "côté à distance". Puisque les types implémentés par cet objet ne sont pas visibles par l'application cliente (rappelez-vous, une identité de type est définie par le nom de la classe, ainsi que par le chargeur de classe à partir duquel elle a été chargée). Vous pourriez penser que c'est une chose étrange, mais gardez à l'esprit que les applications qui se parlent entre elles ne sont pas la norme dans le développement JavaEE - les applications sont censées être isolées les unes des autres, ne partageant que le niveau système Ressources.

+1

Merci pour la réponse. Ce qui m'a troublé, c'est que Weblogic écrit à propos des EJB que l'invocation d'EJB inter-applications ne peut se faire que via une interface distante. Je sais que cela n'a rien à voir avec les EJB, mais j'ai déduit que demander un objet JNDI résidant dans une autre application utiliserait un mécanisme distant similaire, ce qui ne devrait pas être vrai. – ron

+0

C'est exact, oui.Lorsqu'un EJB accessible à distance est publié sur JNDI, il publie explicitement un stub. – skaffman

Questions connexes