2014-01-03 2 views
2

У меня есть приложение Enterprise, которое имеет EJB Stateless и веб-службу на основе JAX-WS. Веб-сервис при вызове будет внутренне вызывать EJB . lib содержит общие библиотеки, необходимые как для EJB, так и для WAR. Я сталкиваюсь с двумя проблемами при доступе к EJB по-разному. Он отлично работает, когда я к нему доступ через веб-службыРазвертывание EJB и доступ к нему с использованием удаленных и локальных ссылок

Это развертывается на IBM WAS v7 Это структура EAR

MyProject.EAR 
    webservice.war 
    ejb.jar 
    lib 
     abc.jar 
     xyz.jar 

Сейчас в EJB У меня есть класс, который подвергается воздействию, как Remote и Local.

@Stateless 
public class MyAccountBean implements AccountLocal,AccountRemote{ 

} 

Как уже упоминалось выше, в веб-проекте мы вызываем EJB, используя локальную ссылку.

AccountLocal accLocal=(AccountLocal)ctx.lookup("ejblocal:com.my.test.account.AccountLocal"); 

Это прекрасно работает.

Первый выпуск: -

У нас есть еще одно приложение EAR развернутого на одной и той же виртуальной машины Java в WAS. Из этого приложения мы пытаемся получить доступ к EJB, доступному в MyProject.EAR. Можно ли получить эту информацию с помощью поиска JNDI, так как они оба находятся на одной JVM? Мы пробовали использовать код ниже:

AccountLocal accLocal=(AccountLocal)ctx.lookup("jndiOfAccountLocal"); 

Но он дает исключение класса.

Error 500: java.lang.ClassCastException: com.my.test.account.EJSLocal0SLDAccount_e303bda3 incompatible with com.my.test.account.AccountLocal 

Второй выпуск: -

Вторая проблема, которую мы имеем с поиском удаленного EJB. Ниже приведен код, который мы используем для получения ссылки удаленного EJB из веб-приложения, развернутого на другом сервере.

Properties props = new Properties(); 
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); 
props.put(javax.naming.Context.PROVIDER_URL, "iiop://localhost:2809"); 

AccountRemote remote = null; 
try{ 
    InitialContext ctx = new InitialContext(props); 

    lobj = ctx.lookup("dcpejbsvc"); 

    AccountRemote remoteObj = (AccountRemote)PortableRemoteObject.narrow(lobj, AccountRemote.class); 

    InputVO input = constructInput(); 

    OutputVO output = remoteObj.getAccountInfo(input); 
} 
catch(NamingException e){ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Это дает класс литая исключение, Error 500: java.lang.ClassCastException: cannot cast class org.omg.stub.java.rmi._Remote_Stub to interface com.my.test.account.AccountRemote

Не могли бы вы, пожалуйста, руководство меня, чтобы исправить эти проблемы?

Обновлено: я получил подробный ответ от post в coderanch. Как и в первом ответе

+0

Аналогичная проблема (не совсем) на JBOSS обсуждалась здесь http://stackoverflow.com/questions/7269680/classcastexception-when-casting-looked-up-ejb-view-in-as7 –

ответ

1

Для первой проблемы см. Раздел «Локальные виды клиентов» раздела EJB modules в Инфоцентре. В частности, тот же класс локального интерфейса должен быть видимым (с точки зрения ClassLoader) для обоих приложений. Обычно это делается с использованием общей библиотеки с областью действия сервера.

Для второй проблемы, я предполагаю, что ваш «другой сервер» не имеет _AccountRemote_Stub. Является ли другой сервер WebSphere Application Server v7 или новее? Если нет, вам, вероятно, нужно будет создать заглушки, используя команду WAS_HOME/bin/createEJBStubs.В противном случае обновите свой ответ, чтобы показать полную трассировку стека ClassCastException (WebSphere Application Server v7 или более поздняя версия должна автоматически генерировать заглушки, и, возможно, полная трассировка стека даст подсказку).

+0

Удаленная версия WAS is 7.0.0.29 – Swapna

+0

Тогда я не уверен, почему заглушки не были автоматически сгенерированы. Если вы хотите включить трассировку стека, я могу попытаться взглянуть. В противном случае это может быть проблема с продуктом, и вы можете попробовать открыть PMR с IBM. –

Смежные вопросы