Question

Voici ma classe Java

import endpoint.NewSessionRemote;
import javax.naming.Context;
import javax.naming.InitialContext;

public class HelloClient {

    public static void main(String[] args) {
        try {
            Context ctx = new InitialContext();
            NewSessionRemote hello = (NewSessionRemote) ctx.lookup("endpoint.NewSessionRemote");
            System.out.println(hello.stringChange(4));
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}

Lorsque j'exécute ce cours, je reçois une exception.

    javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found
        at com.sun.enterprise.naming.TransientContext.doLookup(TransientContext.java:216)
        at com.sun.enterprise.naming.TransientContext.lookup(TransientContext.java:188)
        at com.sun.enterprise.naming.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:74)
        at com.sun.enterprise.naming.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:129)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
java.lang.NullPointerException

Toutes les autres classes de beans entreprise sont écrites conformément à la norme EJB 3.0. Votre précieuse contribution est attendue.

Solution

L'exception était

javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found

Cela se produit parce que le nom JNDI attribué par l'application ne correspond pas au nom JNDI actuel du serveur (Glassfish). J'ai donc vérifié l'arborescence JNDI dans Glassish via sa console d'administration (spécifique au fournisseur), puis j'ai vérifié. Notez que l'interface JNDI de l'interface NewSessionRemote (qui est l'interface professionnelle du bean session NewSessionBean ) est différente du nom que j'ai donné du côté de l'application. Alors, comment cela s’est-il produit alors que j’ai soudain eu l’idée que le ejb-jar.xml nom est un autre nom JNDI attribué au même NewSessionRemote à l’aide de tag. Donc, je le supprime simplement et redéploie le module EJB. C'est ça.

Était-ce utile?

La solution

Lorsque vous utilisez JNDI, vous utilisez une API nécessitant une configuration spécifique sous-jacente pour la connexion au serveur (voir Javadoc pour plus de détails sur la configuration. Par exemple, java.naming.factory.initial est la propriété qui indique quelle implémentation de JNDI vous souhaitez utiliser.

Désormais, lors de l'exécution de code sur un serveur JavaEE, cette configuration est disponible de manière implicite. Il vous suffit de procéder comme dans votre code: instancier InitialContext et effectuer une recherche. Toutefois, lors de l'exécution en dehors du serveur, cette configuration implicite n'est pas présente et vous devez donc configurer explicitement votre InitialContext .

Votre exemple de code utilise une méthode main () , qui suggère que vous exécutez en dehors du conteneur. La configuration dont vous avez besoin dépend de votre serveur d’applications spécifique. Vous devrez donc consulter cette documentation pour savoir quelle configuration fournir.

Autres conseils

On dirait que vous n'avez pas de registre RMI (c'est-à-dire un serveur actif) contre lequel vous lookingUp () .

Vous n'avez fourni aucune variable Context.INITIAL_CONTEXT_FACTORY , la recherche doit donc être une URL valide, ce qui n'est pas le cas.

Par conséquent, vous devriez mettre quelque chose comme ceci sur votre env (sur le iCtx ):

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");

Je vous suggère de lire les exemples simples à http://java.sun.com/j2se/1.5.0/docs/guide/jndi/jndi-rmi.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top