Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Перекрестные ссылки EJB


Автор: Костянтин 19.4.2008, 13:47
Доброго времени суток!

Столкнулся со следующей проблемой: в системе есть несколько session bean'ов. Один statefull, который является точкой входа на сервер и хранит сессию 

пользователя (некий объект UserSession).  Осталяные bean'ы - не сессионные и используются для доступа к базе данных, формирования отчетов и т.д.
Сейчас обращение к методу несессионного bean'а происходит по следующей схеме:
- клиент обращается к методу statefull bean'а.
- метод statefull bean'а создает ссылку на необходимый stateless bean и передает в него входящие параметры и объект UserSession. 
- получаемый ответ возвращает клиенту. 
Проблема в том, что каждый метод описывается в 4х местах - реализация в stateless bean'е, обращение в statefull bean'е и сигнатуры в интерфейсах этих 

bean'ов. 
Подскажите, как можно упростить эту схему?

P.S. Пример кода:
Код

//statefull bean, хранящий сессию пользователя
public class BeanWithClientSession implements SessionBean {
    private UserSession userSession; //информация о пользователе, 
                     //объект инициализируется при подключении пользователя
    public Item getItem(Long id) {
         try {
                 return getStatelessEjb().getItem(userSession, id);
         } catch (Exception e) {}
         return null;
     }

    public StatelessEjb getStatelessEjb() {
         try {
                 InitialContext namingContext = new InitialContext();
                 Object ref = namingContext.lookup("StatelessEjb");
                 StatelessEjbHome home = (StatelessEjbHome)PortableRemoteObject.narrow(ref, StatelessEjbHome.class);
                 return home.create();
         } catch (Throwable e) { }
         return null;
     }
}


//интерфейс statefull bean'а
public interface Server extends EJBObject {
    public Item getItem(Long id) throws RemoteException;

}

//stateless bean
public class StatelessEjbBean implements SessionBean {

    public Item getItem(Long id, UserSession userSession) {
        return getItemFromDB(id, userSession.getUserId());
    }
}


// интерфейс stateless bean'а
public interface StatelessEjb extends EJBObject {
    public Item getItem(Long id, UserSession userSession) throws RemoteException;
}


Описание метода getItem() дублируется 4 раза.  smile 

Автор: ekr 23.4.2008, 01:06
Цитата(Костянтин @  19.4.2008,  13:47 Найти цитируемый пост)
Осталяные bean'ы - не сессионные

А какие? Entity?
Из дальнейшего текста я понял, что все-таки session, но просто stateless.
Из контекста я так же сделал вывод, что используется версия 2 ejb.

Цитата(Костянтин @  19.4.2008,  13:47 Найти цитируемый пост)
Проблема в том, что каждый метод описывается в 4х местах - реализация в stateless bean'е, обращение в statefull bean'е и сигнатуры в интерфейсах этих bean'ов. 
Подскажите, как можно упростить эту схему?

Боюсь, что никак. Афишируемый клиенту метод любого (кроме mdb) ebj 2 описывается в remote-интерфейсе и реализуется классе реализации. А если у двух ejb методы совпадают (как здесь у stateless и statefull бинов), то соответственно, имеем четыре метода.

Могут помочь инструменты разработки снизить объем набиваемого кода, но на их выходе получится все равно требуемых четыре метода.


PS 
Цитата(Костянтин @  19.4.2008,  13:47 Найти цитируемый пост)
метод statefull bean'а создает ссылку на необходимый stateless bean

Проще закешировать один раз.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)