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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> интерфейсы и EJB 3.0, интерфейсы и EJB 3.0 
:(
    Опции темы
Grishanya
Дата 10.7.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!

Я относительно недавно начал разбираться с технологией EJB 3.0. В связи с этим есть вопрос:

Имеется задача написания приложения EE, которое должно быть расширяемо. Т.е. в идеале необходимо разработаь некий интерфейс, который реализовывали компоненты. Т.е. есть некоторый серверный компонент, который может общаться с другими компонентами через интерфейс, который в нём же и определён. Т.е. все EJB компоненты должны помимо своих Remote и Local интерфейсов реализовать ещё один - некий универсальный интерфейс. Коим образом можно это реализовать? 

Заранее спасибо!
PM MAIL   Вверх
MisterCleric
Дата 10.7.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Берешь и наследуешь в Remote и Local этот интерфейс
вот тебе пример:
Код

public interface DAO<T, ID extends Serializable> {
...
}
---------------------------------------
public abstract class EJB3DAO<T, ID extends Serializable> implements DAO<T, ID> {
.............
}
---------------------------------------
public interface DictionaryDAO extends DAO<BaseDictionaryEntity, Long> {
...
}
---------------------------------------
@Stateless
@Local(DictionaryDAO.class)
public class DictionaryDAOBean extends EJB3DAO<BaseDictionaryEntity, Long> implements DictionaryDAO {
...
}


Ну, у меня тут может немного сложновато, так как генерики используются, но собственно зато видно, что наследование в EJB3 такое же, как и везде


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


Новичок



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

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



Цитата(MisterCleric @ 10.7.2009,  15:24)
Берешь и наследуешь в Remote и Local этот интерфейс
вот тебе пример:
Код

public interface DAO<T, ID extends Serializable> {
...
}
---------------------------------------
public abstract class EJB3DAO<T, ID extends Serializable> implements DAO<T, ID> {
.............
}
---------------------------------------
public interface DictionaryDAO extends DAO<BaseDictionaryEntity, Long> {
...
}
---------------------------------------
@Stateless
@Local(DictionaryDAO.class)
public class DictionaryDAOBean extends EJB3DAO<BaseDictionaryEntity, Long> implements DictionaryDAO {
...
}


Ну, у меня тут может немного сложновато, так как генерики используются, но собственно зато видно, что наследование в EJB3 такое же, как и везде

Может я чего-то не догоняю, но у меня вот какой вопрос возник. 

Допустим я создаю интерфейс SomeInterface и затем наследуюсь от него в Remote и Local интерфейсах другого бина. Далее, чтобы определить наличие таких вот бинов я делаю что-то наподобие:


InitialContext context = new InitialContext();
NamingEnumeration<NameClassPair> enumeration = context.list("");
while (enumeration.hasMore()) {
    String className = enumeration.nextElement().getClassName();
    
    SomeInterface int = (SomeInterface) context.lookup(className);
}

и вот на строчке, где я делаю Lookup  у меня появляется исключение, Class Not found ибо в бине нет Remote класса... 

Может я что не правильно делаю... Но суть состоит в том, чтобы получать информацию о классах, удалённые интерфейсы которых отсутствуют, а присутствует только предопределённый интерфейс.

Может я несколько сумбурно изъясняюсь... Прошу прощения... 


P.S. Очень бы поспособствовал кусочек кода... smile smile 

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


Эксперт
***


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

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



Цитата

 SomeInterface int = (SomeInterface) context.lookup(className);

Утверждение не верно: lookupв JNDI делается по тому имени, которые ты указал бину использовать или по-умолчанию что-то типа такого:
Цитата

[earName]/[BeanClassName]/[remote] или [remote]


что за Class Not found в каком месте?
И такое: если интерфейс бина наследует какой-то другой интерфейс, то 
Цитата

 SomeInterface int = (SomeInterface) context.lookup


Собственно не понятно пока даже в чем суть вопроса? 
Примеры ваших бинов в студию!!!
Под какими JNDI-имена они байндятся?
Опредлены ли Local Remote на уровне бина.
Да и еще такое вспомнил: разные бины могут имплементить один и тот же интерфейс, главное, что бы они были забайндены под разными именами. И с другой стороны: один и тот же интерфейс может быть и Local и Remote


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


Новичок



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

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



Собственно бины:

импорты я опустил


Код

// Интерфейс, который должны реализовать бины, расширяющие функциональность приложения 

public interface AnimalInterface {
    public List<String> getSpecies();
}



// Кошечки 

Код

@Stateless
public class CatSessionBeanBean implements CatSessionBeanRemote, CatSessionBeanLocal {

    public String sayMay() {
        return "May";
    }

    public List<String> getSpecies() {
        return Arrays.asList(allDogs);
    }
    private String[] allDogs = new String[]{
        "SIBIRSKAYA",
        "EXVROPEISKAYA",
        "PERSIDSKAYA"
    };
}

@Remote
public interface CatSessionBeanRemote extends AnimalInterface {
    public String sayMay();
}

@Local
public interface CatSessionBeanLocal  extends AnimalInterface {
    public String sayMay();
}




// Собаки

Код

@Stateless
public class DogsSessionBean implements DogsSessionRemote, DogsSessionLocal {

    public String sayGav() {
        return "Gav-Gav";
    }

    public List<String> getSpecies() {
        return Arrays.asList(allDogs);
    }

    private String[] allDogs = new String[] {
        "TAKSA",
        "OVCHARKA",
        "PEKINES"
    };
}


@Remote
public interface DogsSessionRemote extends AnimalInterface {
    public String sayGav();
}

@Local
public interface DogsSessionLocal extends AnimalInterface {
    public String sayGav();
}





// Бин, взаимодействующий с предыдущими бинами через объявленный в начале интерфейс
Код

@Stateless
public class AnimalSessionBean implements AnimalSessionRemote, AnimalSessionLocal {
    
    public void printAllAnimal() throws NamingException {
        // Здесь необходим кусок кода который вернёт: список всех кошек и собак  :dash1 

    }

}




Это сообщение отредактировал(а) Grishanya - 10.7.2009, 23:29
PM MAIL   Вверх
Grishanya
Дата 13.7.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всё, проблема решена! smile Оказалось всё крайне просто. Всем спасибо!
PM MAIL   Вверх
MisterCleric
Дата 13.7.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Оказалось всё крайне просто. 

Не-е. так не пойдет. Нам тоже хочется знать, что было не так. Поясняй. Мы здесь и собираемся для того, что бы друг друга выручать. Я тебе что-то писал-писал, а оно ли надо было не ясно. А вдруг та проблема, какая у тебя возникла, когда-нибудь вылезет и у меня...


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


Новичок



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

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



Цитата(MisterCleric @ 13.7.2009,  14:59)
Цитата

Оказалось всё крайне просто. 

Не-е. так не пойдет. Нам тоже хочется знать, что было не так. Поясняй. Мы здесь и собираемся для того, что бы друг друга выручать. Я тебе что-то писал-писал, а оно ли надо было не ясно. А вдруг та проблема, какая у тебя возникла, когда-нибудь вылезет и у меня...

Думал, что никому не интересно...
Ок. По просьбам трудящихся рассказываю как дело было.


В приведённом выше примере необходимо исправить следующее:


Код

// Делаем его удалённым. Это раз
@Remote
public interface AnimalInterface {
    public List<String> getSpecies();
}



// Для бинов, расширяющих функциональность указываем  JNDI имя ПЛЮС делаем его имплементацией вышеуказанного интерфейса. Это два

Код

@Stateless(mappedName="Animals/DogsSessionBean")
public class DogsSessionBean implements DogsSessionRemote, DogsSessionLocal,  AnimalInterface {
...
}


@Stateless(mappedName="Animals/CatSessionBeanBean")
public class CatSessionBeanBean implements CatSessionBeanRemote, CatSessionBeanLocal,  AnimalInterface {
...
}


Ну и на последок, в бине, который пользуется расширениями и в котором содержится интерфейс AnimalInterface делаем следующее:

 
Код

           NamingEnumeration<NameClassPair> beans = context.list("Animals");
            while (beans.hasMore()) {
                String name = "Animals/" + beans.next().getName();
                System.out.println("name: " + name);
                try {
                    Object obj = context.lookup(name);
                    if (obj instanceof AnimalInterface) {
                         System.out.println("Ура-ура-ура!!!");
                    }
                } catch (NamingException e) {
                   //e.printStackTrace();
                }


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

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

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


 




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


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

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