Доступ к удаленному корпоративному компоненту в простом классе Java

StackOverflow https://stackoverflow.com/questions/1620803

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Решение

Исключением было

javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found

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

Это было полезно?

Решение

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

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

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

Другие советы

Похоже, у вас нет реестра RMI (т.е.активный сервер) вы являетесь lookingUp() против.

Вы не предоставили никаких Context.INITIAL_CONTEXT_FACTORY переменная, поэтому поиск должен быть допустимым URL-адресом, которым он не является.

Следовательно, вы должны поместить что-то подобное на свой 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top