Avatar billede fredand Forsker
27. januar 2008 - 19:03 Der er 6 kommentarer og
1 løsning

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
Avatar billede arne_v Ekspert
27. januar 2008 - 19:12 #1
Try:

Context context = getWebLogicInitialContext();
Object object = context.lookup("namesejb/client/NameManagerEJBHome");
NameManagerEJBHome nameManagerEJBHome = (NameManagerEJBHome)PortableRemoteObject.narrow(object, NameManagerEJBHome.class);
NameManangerEJBObject nameManangerEJBObject = nameManagerEJBHome.create());
nameManangerEJBObject.addName(name);
Avatar billede arne_v Ekspert
27. januar 2008 - 19:12 #2
You only need to narrow the home object.
Avatar billede fredand Forsker
17. april 2008 - 21:48 #3
Hello!

Finally I got some time to look into this problem again.
I tried out what you said, but unfortenately I still got problem.
I tried it like this, and also printed out the class names of the instance:

        try
        {
            System.out.println("addNameWSEJB start " + name);
            Context context = getWebLogicInitialContext();
           
            Object object1 = context.lookup("namesejb/client/NameManagerEJBHome");
            System.out.println(object1.getClass().getName());
           
            Object object2 = PortableRemoteObject.narrow(object1, Object.class);
            System.out.println(object2.getClass().getName());

            NameManagerEJBHome nameManagerEJBHome = (NameManagerEJBHome)PortableRemoteObject.narrow(object1, NameManagerEJBHome.class);
            NameManangerEJBObject nameManangerEJBObject = nameManagerEJBHome.create();
           
            nameManangerEJBObject.addName(name);
           
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

But I just get this:
getNamesWSEJB start
namesejb.server.NameManagerSessionBean_o0oo54_HomeImpl_816_WLStub
namesejb.server.NameManagerSessionBean_o0oo54_HomeImpl_816_WLStub
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:31)
        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)

To me it looks strange that the name of the class for the instances is:
namesejb.server.NameManagerSessionBean_o0oo54_HomeImpl_816_WLStub

So if any one got any ideas plaes let me know!

Best regards
Fredrik
Avatar billede fredand Forsker
21. april 2008 - 21:53 #4
Hello!

I still hope that any one see this old thread.

I found this link that looks like the same problem like I have:

http://forum.java.sun.com/thread.jspa?threadID=5190032&tstart=391

I added this code into standalone app and into my webservice:
Object object = context.lookup("namesejb/client/NameManagerEJBHome");
System.out.println((object instanceof NameManagerEJBHome));

From my standalone it gave me true, but from my webservice it gave me false.

It looks like the guy who wrote the thread in the link above solved this by make sure the class is in the classpath.

I have put the class file booth inside my ejb_server (namesejb.jar) and in my webservice_server (nameswebservice.aar)

But still I get the same error.

I also added:
Class c = Class.forName("namesejb.client.NameManagerEJBHome");

To me this would give me a ClassNotFoundException if the class is not in the classpath.
But it works with out any problem.

So if any one see anyhting that I might miss, please let me know!
Best regards
Fredrik
Avatar billede fredand Forsker
26. august 2008 - 21:03 #5
I put the jars in the startup script for my wls, the it worked.

I will start a new thread to see if you guys see a better solution.

Btw, please Arne give a svar, without your help I would not have solved it.

Best regards
Fredrik
Avatar billede arne_v Ekspert
28. august 2008 - 04:20 #6
I will skip points in this one.
Avatar billede fredand Forsker
28. august 2008 - 19:20 #7
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester