Re[3]: Как запретить клиенту создание экземпляра EJB-компоне
От: dshe  
Дата: 10.02.04 06:41
Оценка: 2 (1)
Здравствуйте, Eugene Sh, Вы писали:

ES>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Eugene Sh, Вы писали:


ES>>>Заранее извиняюсь на возможную неточность в терминологии.

ES>>>Ситуация такая.
ES>>>Есть несколько интерфейсов, они реализуются в нескольких EJB-компонентах. Клиент должен получать только один интерфейс IpStart. Все остальные ему предоставляет этот интерфейс IpStart. Т.е. напрямую создавать экземпляры других интерфейсов ему нельзя. Как запретить такое создание?

А>>подробнее можно? какой EJB (session, entity...)? и что ты понимаешь под "Клиент должен получать только один интерфейс IpStart"? Насколько я понимаю, клиент получает home или local home interface через JNDI, а потом, используя полученный home, получает remote или local interface соответственно.

ES>Session EJB.
ES>Вобщем, нужно, чтобы клиент не мог получить home интерфейс остальных ejb`шек. Или, получив home интерфейс, не мог вызвать у него метод create. При этом другие ejb`шки должны спокойно получать home интерфейс и вызывать метод create.

Я не нашел ограничений в спецификации, которые бы мешали в бине в бине (назовем его DispatcherEJB) сделать бизнес-метод, который возвращает другой бин (точнее его remote interface). Т.е. в принципе можно сделать так:
// remote interface of DispatcherEJB
interface Dispatcher extends EJBObject {
    public RealWorker getRealWorker() throws RemoteException;
}

а реализовать этот DispatcherEJB таким образом:
// implementation class of DispatcherEJB
class DispatcherBean implements SessionBean {
    // . . .
    public RealWorker getRealWorker() throws RemoteException {
        try {
            Context context = new InitialContext();
            Object ref = context.lookup("ejb/RealWorker");
            RealWorkerHome home =
                    (RealWorkerHome) PortableRemoteObject.narrow(ref, RealWorkerHome.class);
            return home.create();
        }
        catch(Exception exc) {
            throw new RemoteException("error", exc);
        }
    }
}


и естественно, в deployment descriptor'е DispatcherEJB должна быть прописана ссылка на RealWorkerEJB (в данном случае с ejb-ref-name содержащим строку ejb/RealWorker), а клиенту достаточно просто ссылаться на DispatcherEJB.

Если в deployment descriptor'е клиента НЕ прописать ссылку на RealWorkerEJB, то он и не сможет получить его home interface и, следовательно, не сможет создать.


Однако, такой подход, как мне кажется, оправдан только в том случае, когда определение того, какие реализации RealWorker'а использовать, -- является частью бизнес логики. Например, метод getRealWorker мог бы принимать некоторые параметры и в зависимости от них выбирать бины с различными JNDI именами. На мой взгляд, необходимость делать такой финт, возникает довольно редко. Гораздо лучше было бы Bean Provider'у прописать в deployment descriptor'е все ссылки на внешние бины, а Application Assembler'у статически настроить связи между бинами и/или клиентом и бинами.
--
Дмитро