How to call ejb:s from axis2?
Hello!I'm playing around with axis2 at home.
I have a small application arch around a database called names.
This database consist of one table of names.
To access the database I have developed a hibernate package called nameshibernate.jar
I have also developed a ejb package that uses nameshibernate.jar, called namesejb_server.jar. And for any client to the ejb I got a namesejb_client.jar.
This ejb is running within a weblogic manage server 8.1.6
I have also developed a standalone Java application, namesjavaapplication.jar, that can access the database direct through nameshibernate.jar, and also through namesejb.jar.
This works fine:
namesjavaapplication.jar
->nameshibernate.jar
->->database
namesjavaapplication.jar
->namesejb.jar
->->nameshibernate.jar
->->->database
Now I am trying to access it through a webservice, with axis2.
My axis2 runs in an other weblogic manage server 8.1.6
I have developed a package called nameswebservice.aar. And for any client to the webservice I got a nameswebservice_client.jar.
The communicatio between the standalone Java application and the .aar works fine:
namesjavaapplication.jar
->nameswebservice.aar
But if I try to do it all the way like:
namesjavaapplication.jar
->nameswebservice.aar
->->namesejb.jar
->->->nameshibernate.jar
->->->->database
It crash between:
->nameswebservice.aar
->->namesejb.jar
I get this exception, and I can not figure out why, since the code to call the ejb is the same in namesjavaapplication.jar and in nameswebservice.aar.
java.lang.ClassCastException: Cannot narrow remote object to namesejb.client.NameManagerEJBHome
at weblogic.iiop.PortableRemoteObjectDelegateImpl.narrow(PortableRemoteObjectDelegateImpl.java:242)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:134)
at nameswebservices.NamesWebService.getNamesWSEJB(NamesWebService.java:33)
at jrockit.reflect.VirtualNativeMethodInvoker.invoke(Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)
at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:165)
at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:98)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:96)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:145)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:120)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1077)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:7047)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3902)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
The code that uses the ejb_client looks like:
Context context = getWebLogicInitialContext();
Object object = context.lookup("namesejb/client/NameManagerEJBHome");
NameManagerEJBHome nameManagerEJBHome = (NameManagerEJBHome)PortableRemoteObject.narrow(object, NameManagerEJBHome.class);
NameManangerEJBObject nameManangerEJBObject = (NameManangerEJBObject)PortableRemoteObject.narrow(nameManagerEJBHome.create(), NameManangerEJBObject.class);
nameManangerEJBObject.addName(name);
And just for the record this is my getWebLogicInitialContext(), that works fine.
private Context getWebLogicInitialContext() throws Exception
{
java.util.Hashtable h = new java.util.Hashtable();
h.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, "t3://localhost:7011");
return new InitialContext(h);
}
In both packages I have extracted namesejb_client.jar, this means that in both namesjavaapplication.jar and nameswebservice.aar, in the root, I have extracted the namesejb_client.jar. So I have it like: namesejb/client/NameManagerEJBHome from the root.
So if you guys see anything fishy or got any clue, please let me know.
Best regards
Fredrik