У меня есть приложение 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. Как и в первом ответе
Аналогичная проблема (не совсем) на JBOSS обсуждалась здесь http://stackoverflow.com/questions/7269680/classcastexception-when-casting-looked-up-ejb-view-in-as7 –