Доступ к удаленным объектам с помощью клиента RMI путем создания начального контекста и выполнения поиска

#weblogic #rmi #jndi #weblogic-10.x

#weblogic #rmi #jndi #weblogic-10.x

Вопрос:

Я пытаюсь выполнить поиск класса PublicRepository из EJB на сервере Weblogic 10. Это фрагмент кода:

 /**
     * RMI/IIOP clients should use this narrow function
     */
private static Object narrow(Object ref, Class c) {
    return PortableRemoteObject.narrow(ref, c);
}

/**
 * Lookup the EJBs home in the JNDI tree
 */
private static PublicRepository lookupHome() throws NamingException {
    // Lookup the beans home using JNDI
    Context ctx = getInitialContext();

    try {

        Object home = ctx.lookup("cea");
        return (PublicRepository) narrow(home, PublicRepository.class);

    } catch(NamingException ne) {
        System.out.println("The client was unable to lookup the EJBHome.  Please make sure ");
        System.out.println("that you have deployed the ejb with the JNDI name "
          "cea"   " on the WebLogic server at "   "iiop://localhost:7001");
        throw ne;
    }
}


private static Context getInitialContext() throws NamingException {

    try {
        // Get an InitialContext
        Properties h = new Properties();
        h.put(Context.INITIAL_CONTEXT_FACTORY,
        "weblogic.jndi.WLInitialContextFactory");
        h.put(Context.PROVIDER_URL, "iiop://localhost:7001");
        return new InitialContext(h);

    } catch(NamingException ne) {
        System.out.println("We were unable to get a connection to the WebLogic server at "   "iiop://localhost:7001");
        System.out.println("Please make sure that the server is running.");
        throw ne;
    }
}
  

Однако я получаю приведенное исключение:

 Exception in thread "main" java.lang.ClassCastException
    at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(Unknown Source)
    at javax.rmi.PortableRemoteObject.narrow(Unknown Source)
    at vrd.narrow(vrd.java:67)
    at vrd.lookupHome(vrd.java:80)
    at vrd.main(vrd.java:34)
Caused by: java.lang.ClassCastException: weblogic.corba.j2ee.naming.ContextImpl
    ... 5 more
  

Прав ли я, когда использую приведенный выше код для повторного поиска определенного класса, который будет использоваться в моем клиентском приложении? Как я мог бы избавиться от исключения приведения?

Комментарии:

1. Можете ли вы предоставить полный код для класса вместе с путем к классу вашего клиентского приложения? Пакет, на который ссылается исключение, выглядит подозрительно.

2. Какую версию EJB вы пытаетесь найти? Это EJB 3? EJB2? Также с помощью weblogic 10.x вы можете рассмотреть возможность использования аннотаций для получения ссылок на EJB. Не могли бы вы, пожалуйста, подробнее рассказать о своей проблеме?

Ответ №1:

Проще всего было бы сохранить результат ‘narrow’ в java.lang.Объект, а затем посмотрите, какого он типа…

Комментарии:

1. Хм, я попробовал это, и я все еще получаю исключение приведения!? Кстати, PublicRepository расширяет тип EJBObject.

2. Я весьма удивлен, что вы получаете ClassCastException при попытке присвоить результат метода «Объекту»…

3. Вы должны передать Object.class для сужения(), вместо PublicRepository.class. Фактическое исключение ClassCastException генерируется в основном внутри narrow(), а не при возврате метода. Но сначала, почему бы вам просто не распечатать home.getClass()?

Ответ №2:

Ошибка означает, что вы искали контекст, а не связанный объект. Другими словами, вы искали «cea» вместо чего-то вроде «cea / Bean». Это аналогично использованию FileInputStream в каталоге.

Ответ №3:

Я использовал неправильное имя JNDI, следовательно, он не смог извлечь объект. Спасибо всем за просмотр.