Сначала я хочу сказать, что здесь задавали аналогичный вопрос, но все же я не могу найти решение моей проблемы.Проблема поиска EJB с сервером приложений WebSphere 6.1
У меня есть EJB 3 Project (name = HelloWorldEJBProject). Там я создал автономный удаленный EJB (name = HelloWorldEJB). Я также создал там удаленный интерфейс (name = HelloWorldEJBInterfaceRemote). После этого я создаю банку & ухо проекта после компиляции всего, используя ant. Затем я развернул EAR в WebSphere Application Server 6.1.
Далее Я также создал автономный проект java (name = HelloWorldClient), поместите jar HelloWorldEJBProject в этот путь построения проекта. Теперь, пока я делаю поиск, я получаю ошибки.
HelloWorldEJB.java:
package com.staples.ejb;
import com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote;
import javax.ejb.Stateless;
@Stateless
public class HelloWorldEJB implements HelloWorldEJBInterfaceRemote {
public HelloWorldEJB() {
}
public String helloWorld() {
return "Hello World";
}
}
Client.java (внутри проекта HelloWorldClient):
package com.staples.client.processor;
import com.staples.client.util.ApplicationUtil;
import com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote;
public class Client {
static private HelloWorldEJBInterfaceRemote helloInterface = ApplicationUtil.getHelloEJBHandle();
public static void main(String[] args) {
System.out.println(helloInterface.helloWorld());
}
}
ApplicationUtil.java (внутри проекта HelloWorldClient):
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote;
public class ApplicationUtil {
public static Object getContext(){
Object obj = null;
Context context;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL,"corbaloc:iiop:localhost:2811");
Context ctx = new InitialContext(env);
obj = ctx.lookup("ejb/HelloEAR/Hello.jar/HelloWorldEJB#" + HelloWorldEJBInterfaceRemote.class.getName());
} catch (NamingException e) {
e.printStackTrace();
}
return obj;
}
public static HelloWorldEJBInterfaceRemote getHelloEJBHandle()
{
Object obj = getContext();
HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) PortableRemoteObject.narrow(obj, HelloWorldEJBInterfaceRemote.class);
//HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) obj;
return helloInterface;
}
Ошибка:
Exception in thread "P=141210:O=0:CT" java.lang.ClassCastException: Unable to load class: com.staples.ejb.interfaces._HelloWorldEJBInterfaceRemote_Stub
at com.ibm.rmi.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:372)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:156)
at com.staples.client.util.ApplicationUtil.getHelloEJBHandle(ApplicationUtil.java:41)
at com.staples.client.processor.Client.main(Client.java:14)
Если я комментарий следующее
HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) PortableRemoteObject.narrow(obj, HelloWorldEJBInterfaceRemote.class);
& раскомментируйте:
HelloWorldEJBInterfaceRemote helloInterface = (HelloWorldEJBInterfaceRemote) obj;
то следующая ошибка приходит:
Exception in thread "P=346416:O=0:CT" java.lang.ClassCastException: org.omg.stub.java.rmi._Remote_Stub incompatible with com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote
at com.staples.client.util.ApplicationUtil.getHelloEJBHandle(ApplicationUtil.java:42)
at com.staples.client.processor.Client.main(Client.java:14)
Я использую EJB 3, поэтому, я думаю, мне не нужен PortableRemoteObject.narrow, но без использования этого я получаю другую ошибку. Я также не уверен, что написать в качестве аргумента context.lookup(). Я довольно новичок в EJB. Может ли кто-нибудь помочь мне, пожалуйста? Заранее спасибо. Благодаря MagicWand & bkail для решения моего порта & Проблемы с jndi.
С какого компьютера вы управляете своим клиентом? Это на той же машине, где находится WAS? Если нет, тогда вам нужно изменить ApplicationUtil, чтобы указать на нужную машину, чтобы выполнить поиск JNDI (например, corbaloc: iiop: was_machine: 2809). Другой проблемой может быть порт: 2809 - это порт IIOP по умолчанию, но он задается при создании профиля WAS. Пожалуйста, проверьте порт IIOP на WAS. –
Да, клиент находится на той же машине, что и WAS. В моей консоли администратора websphere порт BOOTSTRAP_ADDRESS - 2811. Это порт, о котором вы говорите? Потому что я не вижу ни одного порта с именем IIOP. @MagicWand – Ajit
После того как вы изменили его на 2811, решается предыдущая ошибка. Новая ошибка: javax.naming.NameNotFoundException: Контекст: VDIPN5243Node03Cell/nodes/VDIPN5243Node03/servers/server1, имя: ejb/HelloEAR/Hello.jar/HelloWorldEJB/com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote: первый компонент в имени HelloWorldEJB/com.staples.ejb.interfaces.HelloWorldEJBInterfaceRemote не найден. [Исключение корня - org.omg.CosNaming.NamingContextPackage.NotFound: IDL: omg.org/CosNaming/NamingContext/NotFound: 1.0] – Ajit