Доступ к удаленному корпоративному компоненту в простом Java-классе - PullRequest
1 голос
/ 25 октября 2009

Вот мой класс 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();
        }

    }
}

Когда я запускаю этот класс, я получаю исключение.

    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

Все остальные классы EJB 3.0 написаны в соответствии со стандартом EJB 3.0. Ожидается ваш ценный вклад.

Решение

Исключение составляло

javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found

Это происходит потому, что имя JNDI, которое было дано стороной приложения, не соответствовало фактическому имени JNDI сервера (Glassfish), поэтому я проверил дерево JNDI в Glassish через его консоль администратора (зависит от поставщика), и я сделал обратите внимание, что JNDI для интерфейса NewSessionRemote (который является бизнес-интерфейсом сессионного компонента NewSessionBean ) отличается от имени, которое я дал на стороне приложения. Так как же это произошло, вдруг мне пришло в голову что-то, что ejb-jar.xml есть другое имя JNDI name, присвоенное тому же NewSessionRemote используя тег. Поэтому я просто удаляю его и заново устанавливаю модуль EJB. Вот и все.

Ответы [ 2 ]

1 голос
/ 25 октября 2009

Похоже, у вас нет реестра RMI (т. Е. Активный сервер), против которого вы lookingUp().

Вы не указали переменную Context.INITIAL_CONTEXT_FACTORY, поэтому в поиске должен быть действительный URL-адрес, а не *. 1005 *

Следовательно, вы должны поместить что-то вроде этого на env (на iCtx):

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

Я предлагаю вам прочитать простые примеры на http://java.sun.com/j2se/1.5.0/docs/guide/jndi/jndi-rmi.html

0 голосов
/ 25 октября 2009

При использовании JNDI вы используете API, которому для подключения к серверу требуется определенная конфигурация (см. Javadoc для получения подробной информации о том, что это за конфигурация). Например, java.naming.factory.initial - это свойство, которое указывает, какую реализацию JNDI вы хотите использовать.

Теперь при запуске кода на сервере JavaEE эта конфигурация доступна неявно, и все, что вам нужно сделать, это то, что вы сделали в своем коде - создать экземпляр InitialContext и выполнить поиск. Однако при работе вне сервера эта неявная конфигурация отсутствует, и поэтому вам необходимо явно настроить InitialContext.

В вашем примере кода используется метод main(), который предполагает, что вы работаете вне контейнера. Конфигурация, в которой вы нуждаетесь, будет зависеть от вашего конкретного сервера приложений, вам нужно поискать эту документацию, чтобы увидеть, какой конфиг предоставить.

...