Ошибка поиска при попытке поиска локального сеанса EJB из автономного класса POJO внутри сервлета

В приложении Java EE я закодировал класс менеджера компоновки. Из этого класса иногда мне нужно получить доступ к сеансу EJB из модуля EJB.

Вот код, и это сгенерированный код:

private MessagesFacadeLocal lookupMessagesFacadeLocal() {
    try {
        Context c = new InitialContext();
        return (MessagesFacadeLocal) c.lookup("java:global/CMS/CMS-ejb/MessagesFacade!cms.model.beans.MessagesFacadeLocal");
    } catch (NamingException ne) {
        Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
        throw new RuntimeException(ne);
    }
}

Но при попытке использовать это, я получаю сообщение об ошибке

java.lang.RuntimeException: javax.naming.NamingException:

Не удалось выполнить поиск 'java:global/CMS/CMS-ejb/MessagesFacade!cms.model.beans.MessagesFacadeLocal'

в SerialContext[myEnv= {java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Корневое исключение — javax.naming.NameNotFoundException: CMS]

Я не уверен, почему у меня возникает эта проблема. Как решить эту проблему?


person mrN    schedule 23.07.2012    source источник


Ответы (1)


В сообщении об ошибке говорится, что контекст «CMS» не может быть найден, поэтому я предполагаю, что имя вашего приложения на самом деле не «CMS». Что возвращает lookup("java:app/AppName")?

Если ваш модуль EJB находится в том же приложении, вы можете использовать lookup("java:app/CMS-ejb-/..."), что в любом случае дает вам немного больше гибкости при изменении имени вашего приложения.

person Brett Kail    schedule 23.07.2012
comment
CMS на самом деле является названием приложения. CMS-war и CMS-ejb — это два разных модуля в приложении. - person mrN; 23.07.2012
comment
Является ли CMS именем приложения, о котором сообщает lookup(java:app/AppName)? - person Brett Kail; 24.07.2012
comment
Нет, когда я запускаю веб-модуль, он возвращает CMS-war в качестве имени приложения. - person mrN; 24.07.2012
comment
И когда я использую (java:app/CMS-ejb)... я получаю ошибку java.lang.ClassCastException: $Proxy157 cannot be cast to cms.model.beans.MessagesFacadeLocal - person mrN; 24.07.2012
comment
И класс, из которого я пытаюсь выполнить поиск, является классом POJO. (Я только что узнал, что этот термин используется) - person mrN; 24.07.2012
comment
Вы уверены, что CMS-war и CMS-ejb развертываются как часть одного EAR, а не как независимые модули? Результат AppName CMS-war и ClassCastException (подразумевающий разные загрузчики классов) заставляет меня задуматься. Что ж, традиционная отладка ClassCastException будет заключаться в печати lookup(java:app/CMS-ejb).getClass().getClassLoader() и MessageFacadeLocal.class.getClassLoader(), чтобы увидеть, отличаются ли они. - person Brett Kail; 25.07.2012
comment
На самом деле я не уверен, я использую Netbeasn в качестве своей IDe, и по умолчанию я создал корпоративное веб-приложение, которое развертывает как CMS-war, так и CMS-ejb как часть одного и того же EAR, по крайней мере, я так думаю. - person mrN; 25.07.2012
comment
Корпоративное веб-приложение звучит как вариант создания WAR. - person Brett Kail; 25.07.2012
comment
Он создает два пакета с одним приложением.. ejb и war.. Я уверен в этом.. потому что я не создавал модули war и ejb по-разному. - person mrN; 26.07.2012