Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по EJB (студенческий отдел кадров), Проблема с клиентом lookup 
V
    Опции темы
eric13
Дата 12.1.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 3.11.2009
Где: Тольятти

Репутация: нет
Всего: нет



http://www.java-course.ru/students/part13.html
Собрал упрощенную EJB часть, она нормально задеплоилась.
Попробовал сделать простого Local клиента.
Для этого продублировал Local  интерфейс в Remote c нужными аннотациями.
В нем при запуске сразу строка
Код

st = (Students) getInitialContext().lookup("ManagementSystemBean/local");

дает 
Код

Exception in thread "main" java.lang.ClassCastException: $Proxy0


В Global JNDI Namespace:
Код

+- ManagementSystemBean(class: org.jnp.interfaces.NamingContext)
  |   +- local (proxy: $Proxy103 implements interface com.vg.jpa.ManagementSystemLocal,interface org.jboss.ejb3.JBossProxy)


Как победить? С Remote интерфейсом та же история.
В инете ответа не нашел..

Нашел проблему, надо было в клиенте писать:

Код

st = (ManagementSystemLocal) getInitialContext().lookup("ManagementSystemBean/local");


От неглубокого знания теории проблема.

Это сообщение отредактировал(а) eric13 - 12.1.2010, 16:49
PM MAIL   Вверх
MisterCleric
Дата 12.1.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Так ты не в того кастишь
тебе надо вот в это com.vg.jpa.ManagementSystemLocal


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
eric13
Дата 12.1.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 3.11.2009
Где: Тольятти

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 12.1.2010,  16:50)
Так ты не в того кастишь

Спасибо, понял.

Но не понял, почему следующим шагом
Код

st.getGroupsList();

и вообще, при вызове любой функции получаю 
Код

Exception in thread "main" javax.ejb.EJBException: Invalid (i.e. remote) invocation of local interface (null container)


Еще при сохранении мелькает worning
Код

initial context did not implement event context


Это сообщение отредактировал(а) eric13 - 12.1.2010, 17:31
PM MAIL   Вверх
MisterCleric
Дата 12.1.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

initial context did not implement event context


Это не страшно: такой уж JNDI у JBOSS. Не имплементит он событийную модель.

А по Exception у меня вопрос: что делает метод getInitialContext() ?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
eric13
Дата 12.1.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 3.11.2009
Где: Тольятти

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 12.1.2010,  17:46)
А по Exception у меня вопрос: что делает метод getInitialContext() ?

Ага..

Да он обычный, взял из работающего тут-же (почти аналогичного, только с одной таблицей в базе) у меня примера..

Код

    @SuppressWarnings("unchecked")
    private static InitialContext getInitialContext() throws Exception {
        Hashtable props = new Hashtable();
        props.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
        props.put("java.naming.provider.url", "localhost");
        
        return new InitialContext(props);
    }


PM MAIL   Вверх
MisterCleric
Дата 12.1.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



А вот что бы на JBOSS можно было лукапить локальные EJB нужно их доставать из чистого InitialContext без пропертей:
Код

 private static InitialContext getInitialContext() throws Exception {
        return new InitialContext();
    }



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
eric13
Дата 13.1.2010, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 3.11.2009
Где: Тольятти

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 12.1.2010,  18:29)
нужно их доставать из чистого InitialContext без пропертей:

Хорошо, но тогда:

Код

 javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial


Судя по описаниям в инете, не хватает именно тех пропертисей..

(Jboss 4.2 , Eclipse 3.4 у меня)

А Remote  интерфейс отрабатывает нормально. 
Я правильно понимаю, что для jsp страниц, запускаемых с того-же  компьютера мне неважен тип (local или remote)?

Это сообщение отредактировал(а) eric13 - 13.1.2010, 08:43
PM MAIL   Вверх
MisterCleric
Дата 13.1.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Странноватая какая-то ошибка...
Вообще даже сами классы JBOSS используют такую конструкцию. Вот пример из одного JBOSS-кого класса:
Код

  public TransactionLocal() {
        try {
            InitialContext context = new InitialContext();
            transactionManager = (TransactionManager) context.lookup("java:/TransactionManager");
        }
        catch (NamingException e) {
            throw new IllegalStateException(
                    "An error occured while looking up the transaction manager: " + e
            );
        }
        initDelegate();
    }


У тебя в папке сервера conf лежит файлик jndi.properties ?

По вопросу с JSP могу сказать такое: Что бы можно было пользоваться локал-интерфейсами, необходимо, что бы все класса твоего приложения были загружены одним ClassLoader'ом. Т.е. надо что бы усе твое приложение было собрано в один ear: и EJB и Web. И важно также что бы этот Local был один на весь ear, т.е. в WEB-INF/lib не должно быть копии этого интерфейса. Иначе будет проблема с проксированием.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
eric13
Дата 13.1.2010, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 3.11.2009
Где: Тольятти

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 13.1.2010,  12:15)
Вот пример из одного JBOSS-кого класса:
Код

transactionManager = (TransactionManager) context.lookup("java:/TransactionManager");




Т.е. вместо context.lookup("Бин/local") надо писать context.lookup("java:/Бин") ?

Файл jndi.properties есть:
Код

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces


Так нет ситуаций, когда local предпочтительнее remote (в контексте написания jsp)?


Спасибо за все ответы!

Это сообщение отредактировал(а) eric13 - 13.1.2010, 12:58
PM MAIL   Вверх
MisterCleric
Дата 13.1.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

Т.е. вместо context.lookup("Бин/local") надо писать context.lookup("java:/Бин") ?


Нет, написал ты все правильно. Под каким именем лежит у тебя бин в JNDI, под таким его от туда и надо забирать.
Предпочтительней использовать, конечно, локал. Так как при ремоут всегда происходит оберта вызова через прокси и сериализация и десиреализация параметров.
Ремоут нужен только, если EJB находится на другом компе. Или придется делать такой вызов, если EJB поднят в одном приложении, а его клиент в другом, что гарантирует работу последнего даже если мы его перенесем на другой комп. Такова архитектура распределенного приложения. 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
eric13
Дата 20.1.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 3.11.2009
Где: Тольятти

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 13.1.2010,  13:09)
Предпочтительней использовать, конечно, локал.

Ясно, Веб- проект сейчас нормально работает с local, спасибо. )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.