Classcastexception on portableremoteobject narrow

I was successfully connecting to an EJB on my WebLogic server from a Java
IDL client using the iiop protocol, cosnaming initialcontextfactory. I'm at
a loss as to what is different now that is causing this to fail. I'm sure
it has something to do with how I'm generating the stubs and/or the
client/server classpath, but can't see what I'm doing wrong now. My steps
are as follows.
1) Create the EJB jar (call it jar1) using weblogic.ejbc
2) Run jar1 through weblogic.ejbc using -idl -iiop, creating jar2
3) Deploy jar2 in the java client's classpath
I get the initial context fine, but when I get to this line:
_home = (myHome)(PortableRemoteObject.narrow(ctx, myHome.class));
I get the following error:
java.lang.ClassCastException
at
com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(PortableRemo
teObject.java:296)
Can anyone give me some assistance?
Thx!
Sandy Barletta

Ok, here's what's going on here. The problem happens when I use
com.sun.jndi.cosnaming.CNCtxFactory as my initial context factory. After the
lookup of the home interface, what I get back in my context object if I call
getClass().getName() is the following:
com.sun.jndi.cosnaming.CNCtx
The class cast exception occurs when I try to narrow this to my home
interface.
If I use weblogic.jndi.WLInitialContextFactory instead of
com.sun.jndi.cosnaming.CNCtxFactory, what I get back in my context object if
I call getClass().getName() is
com.sun.corba.se.internal.iiop.CDRInputStream$1 and the narrow succeeds.
What gives? Do I have to use the weblogic context factory? I was hoping to
avoid the need for weblogic packages on the client. Also, our whole reason
for using IIOP was to avoid compatibility problems between weblogic servers
running at different version levels. If I have to use the weblogic context
factory, and we have a weblogic client running at a different version from
the server, will there be problem?
Sandy Barletta
"Sandy Barletta" <[email protected]> wrote in message
news:[email protected]...
I was successfully connecting to an EJB on my WebLogic server from a Java
IDL client using the iiop protocol, cosnaming initialcontextfactory. I'mat
a loss as to what is different now that is causing this to fail. I'm sure
it has something to do with how I'm generating the stubs and/or the
client/server classpath, but can't see what I'm doing wrong now. My steps
are as follows.
1) Create the EJB jar (call it jar1) using weblogic.ejbc
2) Run jar1 through weblogic.ejbc using -idl -iiop, creating jar2
3) Deploy jar2 in the java client's classpath
I get the initial context fine, but when I get to this line:
_home = (myHome)(PortableRemoteObject.narrow(ctx, myHome.class));
I get the following error:
java.lang.ClassCastException
at
com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(PortableRemo
teObject.java:296)
Can anyone give me some assistance?
Thx!
Sandy Barletta

Similar Messages

  • ClassCastException while PortableRemoteObject.narrow

    Hello,
    I am getting the ClassCastException when I am narrowing the looked up home object.
    Here is the exception:
    java.lang.ClassCastException
         at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:293)
         at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:134)
         at samples.ejb.client.HelloClient.main(HelloClient.java:50)
    Here is the code :
    try {
    System.out.println("Looking up greeter bean home interface");
    String JNDIName = "HelloGreet";
    System.out.println("Looking up: " + JNDIName);
    Object objref = initContext.lookup(JNDIName);
    System.out.println("Object from the look up -->"+objref);
    home = (HelloHome)javax.rmi.PortableRemoteObject.narrow(objref, HelloHome.class);
    any help appreciated. Thanks in advance
    With Regards,
    J. P. Naidu

    Hi Pullaiah,
    I've same problem with Sun ONE AS (notice that I encounter same problem on J2EE Reference Implementation too).I looked up for a solution everywhere but I did't find it and I'd be very happy if someone could post one.
    Thanks ,
    Fil

  • ClassCastException with PortableRemoteObject.narrow call

    I want to call an ejb component located on a different machine and I can not get it to work. So I tried to deploy it under my version of jboss and try to invoke it. I was able to call it but when I added Context.PROVIDER_URL to my properties I get a classCastException.
    String host = "jnp://localhost:1099";
    props.setProperty(Context.PROVIDER_URL, host);
    I started getting the following exception
    2006-11-03 10:17:18,319 ERROR [STDERR] java.lang.ClassCastException
    2006-11-03 10:17:18,319 ERROR [STDERR]      at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narr
    ow(PortableRemoteObject.java:229)
    2006-11-03 10:17:18,319 ERROR [STDERR]      at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObjec
    t.java:137)
    As soon as I uncomment that props.setProperty(Context.PROVIDER_URL, host);
    line everything works fine.
    I have seen this type of exception before when I tried invoking the ejb on a different computer as well. When I inspect the object with reflection I see that it found the right interface.
    This is my code again:
    Properties props = new Properties();
    props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.security.jndi.JndiLoginInitialContextFactory");
    props.setProperty(Context.SECURITY_PRINCIPAL, "admin");
    props.setProperty(Context.SECURITY_CREDENTIALS, "admin");
    props.put(javax.naming.Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    String host = "jnp://localhost:1099";
    props.setProperty(Context.PROVIDER_URL, host);
    ctx = new InitialContext( props );
    Object object = ctx.lookup( "ejb/com/blah/Manager" );
    ManagerRemoteHome home = (ManagerRemoteHome)PortableRemoteObject.narrow ( object, ManagerRemoteHome.class);
    ManagerRemote manager = home.create();
    Thanks

    1099 is the RMI/JRMP Registry. You are using RMI/IIOP. Is this port number really correct?

  • ClassCastException in PortableRemoteObject.narrow inside Weblogic

    Hello,
    I'm trying to invoke EJB residing on WLS 6.1 SP2 server from EJB on another exacly
    the same server.
    Properties properties = new Properties();
    properties.put(javax.naming.Context.PROVIDER_URL, "t3://host:7001");
    properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
    "weblogic.jndi.WLInitialContextFactory");
    ivjInitContext = new InitialContext(properties);
    Object homeObject = ivjInitContext.lookup("jndiName");
    BeanHome home = (BeanHome)PortableRemoteObject.narrow(homeObject,BeanHome.class);
    And I get java.lang.ClassCastException: $Proxy74
    on narrow line.
    Everything works fine when I invoke the same code from regular java application
    instead of EJB.Is it the ClassLoader problem ?
    Does any workaround exists ?
    Thank you.

    How are you generating your stubs? i.e. are you using the -iiop option? if so
    then you would need to call the EJB in question using iiop://host:7001. So you
    can either take out the iiop option and recompile the stubs or change the call
    to iiop but then you would also need to replace this line: properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
    "weblogic.jndi.WLInitialContextFactory");
    with this (javax.naming.Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory");
    hope this helps!
    -geoff.
    "Elena Neroslavskaya" <[email protected]> wrote:
    >
    Hello,
    I'm trying to invoke EJB residing on WLS 6.1 SP2 server from EJB on another
    exacly
    the same server.
    Properties properties = new Properties();
    properties.put(javax.naming.Context.PROVIDER_URL, "t3://host:7001");
    properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
    "weblogic.jndi.WLInitialContextFactory");
    ivjInitContext = new InitialContext(properties);
    Object homeObject = ivjInitContext.lookup("jndiName");
    BeanHome home = (BeanHome)PortableRemoteObject.narrow(homeObject,BeanHome.class);
    And I get java.lang.ClassCastException: $Proxy74
    on narrow line.
    Everything works fine when I invoke the same code from regular java application
    instead of EJB.Is it the ClassLoader problem ?
    Does any workaround exists ?
    Thank you.

  • Java.lang.ClassCastException PortableRemoteObject.narrow(PortableRemoteObje

    Hi,
    I have a problem with a JNDI -lookup() using the CORBA namig system.
    After looking up: System.out.println( lookup("jndi-name") );
    I get an IOR: IOR:0000000000000053524d493a...............
    ok
    then I print out the name and the package of this object:
    Object o = lookup("jndi-name");
    System.out.println("name of o : " + o.getClass().getName());
    System.out.println("package of o : " + o.getClass().getPackage());
    and get:
    name of o : com.sun.corba.ee.impl.corba.CORBAObjectImpl
    package of o : package com.sun.corba.ee.impl.corba
    I expected the type of a Home-Interface, so that i could narrow the object o:
    PortableRemoteObject.narrow( o , classname);
    and the result is a:
    java.lang.ClassCastException
    at com.sun.corba.ee.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:293)
    at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:134)........
    What's wrong

    The most likely reason is that the stubs for that home interface are not being found. Double-check your classpath to make sure they are available to the code at runtime.
    -ken

  • PortableRemoteObject.narrow throws ClassCastException

    Hi Friends,
    I am trying to access home interface of a stateless session EJB from an Applet running in JRE 1.3.1 in IE. My EJB is running in WebLogic Server 6.1. I am getting a cast error while narrowing the remote home interface. My server and client are running on the same machine though they are in different JVMs. I was able to access this remote home interface in a simple test program running from command line.
    This session bean accesses other entity beans deployed in the same WebLogic server, if that has anything to do with it.
    Following is the error callstack:
    java.lang.ClassCastException
         at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:296)
         at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
    Any help in resolving this issue will be greatly appreciated.
    Thanks,
    Krishna.

    Hello
    I have same problem in Java Web Start.
    This Situation is same.
    I report the result of my investigation.
    I'm having a problem in lookup remote object when using JWS.
    My application runs normally in Java Application without JWS.
    I'm using BEA WebLogic Server 6.1.
    My application acts in EJB client application.
    But my application runs normally in WebLogic Server 6.0 and JWS.
    When I cast remote object to my interface, I encountered this kind of error.
    java.lang.ClassCastException
    at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow
    at javax.rmi.PortableRemoteObject.narrow
    While using WebLogic Server 6.0, I include stub classes in my jar file.
    But in WebLogic Server 6.1, ejbc does not generate stub classes.
    WebLogic uses Dynamic proxy technology in JDK 1.3 for this purpose.
    So, EJB client conflict with sand box security policy...
    When I add the following line to javaws.policy file,
    my application runs without problem.
    permission java.io.SerializablePermission "enableSubstitution";
    Is everyone suffering from this kind of problem?
    Is this problem improved in the future?
    I need more information about this problem.
    I am not sure, this is specification.
    Thanks in advance
    Hiroki

  • Sun One EJB problem - PortableRemoteObject.narrow ClassCastException...

    Hi all,
    I'm using Sun One app server 7 for the first time and am having a bit of difficulty. I have deployed a very simple EAR containing one stateless session bean just to test it. The ear appears to have deployed correctly but PortableRemoteObject.narrow is throwing a ClassCastException when trying to do a remote lookup on the bean.
    I'm using the following env settings...
    initialContextFactory = com.sun.enterprise.naming.SerialInitContextFactory
    providerUrl = iiop://127.0.0.1:3700The lookup appears to work okay - this line of code executes successfully
    Object objref = initialContext.lookup(jndiHomeName);...objref appears to initalise succesfully (if I toString() it I get an iiop stream of some sort). However, it is the next line that is failing...
    Object obj = PortableRemoteObject.narrow(objref, homeClass);...this is the exception I get...
    java.lang.ClassCastException
         at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(Unknown Source)
         at javax.rmi.PortableRemoteObject.narrow(Unknown Source)
         at com.scorlog.ServiceLocator.getRemoteHome(ServiceLocator.java:145)Furthermore, when PortableRemoteObject.narrow() executes, I get the following console exception on the server...
    com.sun.corba.ee.internal.core.DuplicateServiceContext
            at com.sun.corba.ee.internal.core.ServiceContexts.put(ServiceContexts.java:208)
            at com.sun.corba.ee.internal.iiop.ServerRequestImpl.getServiceContextsForReply(ServerRequestImpl.java:258)
            at com.sun.corba.ee.internal.iiop.ServerRequestImpl.createResponse(ServerRequestImpl.java:89)
            at com.sun.corba.ee.internal.POA.SubcontractResponseHandler.createReply(SubcontractResponseHandler.java:50)
            at org.omg.CosNaming.NamingContextExtPOA._invoke(NamingContextExtPOA.java:377)
            at com.sun.corba.ee.internal.POA.GenericPOAServerSC.dispatchToServant(GenericPOAServerSC.java:569)
            at com.sun.corba.ee.internal.POA.GenericPOAServerSC.internalDispatch(GenericPOAServerSC.java:211)
            at com.sun.corba.ee.internal.POA.GenericPOAServerSC.dispatch(GenericPOAServerSC.java:113)
            at com.sun.corba.ee.internal.iiop.ORB.process(ORB.java:275)
            at com.sun.corba.ee.internal.iiop.RequestProcessor.process(RequestProcessor.java:83)
            at com.iplanet.ias.corba.ee.internal.iiop.ServicableWrapper.service(ServicableWrapper.java:25)
            at com.iplanet.ias.util.threadpool.FastThreadPool$ThreadPoolThread.run(FastThreadPool.java:288)
            at java.lang.Thread.run(Thread.java:534)
    FINE: No SAS context element found in service context listI have seen the forum that other users have had similar problems and the suggestion was that the client can't see the ejb stubs. I don't think this is the problem in my case as I deployed the same ear on weblogic 7 (obviously substituting sun-ejb-jar.xml for a weblogic-ejb-jar.xml) and successfully executed the same client code for the remote lookup.
    My feeling is that the problem revolves around the JNDI binding. Could it be the case that even though the object is binding properly, the app server doesn't realise it is an ejb and not a jdbc/jms/mail object? The documentation gives details on looking up a JDBC, javamail, URL, JMS resource (http://docs.sun.com/source/817-2177/djjndi.html) but not ejb so I could be doing something simple wrong here...
    My sun-ejb-jar.xml is as follows....
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Generated by XDoclet -->
    <sun-ejb-jar>
        <enterprise-beans>
            <ejb>
                <ejb-name>SBTest</ejb-name>
                <jndi-name>ejb/SBTestBean</jndi-name>
            </ejb>
        </enterprise-beans>
    </sun-ejb-jar>However, I noticed on another thread, a user had some additional elements under their <ejb> tag like this...
    <?xml version="1.0" encoding="UTF-8"?>
    <sun-ejb-jar>
      <enterprise-beans>
        <name>Ejb1</name>
        <ejb>
          <ejb-name>HelloBean</ejb-name>
          <jndi-name>HelloBean</jndi-name>
          <ejb-ref>
            <ejb-ref-name>ejb/helloBean</ejb-ref-name>
            <jndi-name>HelloBean</jndi-name>
          </ejb-ref>
        </ejb>
      </enterprise-beans>
    </sun-ejb-jar>However, when I tried to add and <ejb-ref> element to my xml doc the ear failed to deploy. This is the error I get in the admin console...
    Error
    Deployment Error -- Error while running ejbc -- Fatal Error from EJB Compiler -- --
    Failed to load deployment descriptor for: testApp cause: Error converting J2EE-
    specific ejb xml to object representation: testApp.jar app_testApp Generated by
    XDoclet This bean has no ejb reference by the name of [ejb/SBtest]
    ejb/SBTestSBTestThis problem is eating up my time and being made all the more frustrating by the fact that a) it deploys on weblogic and b) the documentation is terrible. Even the sample application that comes with sun one only provides the .class files for the code that does the ejb look up and not the .java so you can't see how they hell they do it!
    Unfortunately I am tied to using Sun One so I really need to solve this problem fast. If anyone can provide any help I'd greatly appreciate it.
    Cheers,
    John :)

    I am having the same problem after upgrading to Sun One from iplanet. Any clue?

  • JNDI in ActiveX : javax.rmi.PortableRemoteObject.narrow() can't work ?

    Hi All,
    I got a big head ache of this problem for several days, much appreciated if
    I can get help from you.
    The problem is, I wrote an EJB and already deployed it into Weblogic5.1. I
    also wrote a java EJB client to access this EJB. Everything seemed ok at
    this moment.
    The problem occured after i convert this EJB client to ActiveX and test it
    with Microsoft ActiveX Control Test Container. I log each step in the
    ActiveX, and find the problem is caused by
    javax.rmi.PortableRemoteObject.narrow(). Below is my source code and log
    information. My environment is Server side(weblogic5.1),Client side(java
    run-time3.1 with plug-in).
    Source code:
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFacto
    ry");
    env.put(Context.PROVIDER_URL,"t3://"+ip+":"+port);
    try{
    Log("Init jndi ");
    InitialContext ctx = new InitialContext(env);
    Log("Search Home ");
    Object obj = ctx.lookup("ServiceManagerHome");
    Log("home is "+obj);
    Log("narrow from "+obj.getClass().getName());
    Log("narrow to "+ServiceManagerHome.class.getName());
    obj = PortableRemoteObject.narrow(obj,ServiceManagerHome.class);
    Log("narrow home is "+obj);
    serviceHome = (ServiceManagerHome)obj;
    Log("cast home"+serviceHome);
    serviceManager = serviceHome.create();
    Log("Create EJB bean "+serviceManager);
    } catch (Exception e){
    Log("Err-"+e);
    Log("Err-"+e.getLocalizedMessage());
    Log("Err-"+e.getMessage());
    Log information for ActiveX:
    Init jndi
    Search Home
    home is ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259]
    narrow from rm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub
    narrow to crm.service.ejbimpl.ServiceManagerHome
    Err-java.lang.ClassCastException
    Err-null
    Err-null
    Log information for java EJB Client:
    Init jndi
    Search Home
    home is
    crm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub@-4611900794319518
    045S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259
    narrow from crm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub
    narrow to crm.service.ejbimpl.ServiceManagerHome
    narrow home
    crm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub@-4611900794319518
    045S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259]
    cast
    homecrm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub@-461190079431
    9518045S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259
    Create serviceManager
    crm.service.ejbimpl.ServiceManagerBeanEOImpl_ServiceStub@-461190079431951804
    5S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome_EO [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/258

    Contact support.
    Yuan Ming Lei wrote:
    Hi All,
    I got a big head ache of this problem for several days, much appreciated if
    I can get help from you.
    The problem is, I wrote an EJB and already deployed it into Weblogic5.1. I
    also wrote a java EJB client to access this EJB. Everything seemed ok at
    this moment.
    The problem occured after i convert this EJB client to ActiveX and test it
    with Microsoft ActiveX Control Test Container. I log each step in the
    ActiveX, and find the problem is caused by
    javax.rmi.PortableRemoteObject.narrow(). Below is my source code and log
    information. My environment is Server side(weblogic5.1),Client side(java
    run-time3.1 with plug-in).
    Source code:
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFacto
    ry");
    env.put(Context.PROVIDER_URL,"t3://"+ip+":"+port);
    try{
    Log("Init jndi ");
    InitialContext ctx = new InitialContext(env);
    Log("Search Home ");
    Object obj = ctx.lookup("ServiceManagerHome");
    Log("home is "+obj);
    Log("narrow from "+obj.getClass().getName());
    Log("narrow to "+ServiceManagerHome.class.getName());
    obj = PortableRemoteObject.narrow(obj,ServiceManagerHome.class);
    Log("narrow home is "+obj);
    serviceHome = (ServiceManagerHome)obj;
    Log("cast home"+serviceHome);
    serviceManager = serviceHome.create();
    Log("Create EJB bean "+serviceManager);
    } catch (Exception e){
    Log("Err-"+e);
    Log("Err-"+e.getLocalizedMessage());
    Log("Err-"+e.getMessage());
    Log information for ActiveX:
    Init jndi
    Search Home
    home is ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259]
    narrow from rm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub
    narrow to crm.service.ejbimpl.ServiceManagerHome
    Err-java.lang.ClassCastException
    Err-null
    Err-null
    Log information for java EJB Client:
    Init jndi
    Search Home
    home is
    crm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub@-4611900794319518
    045S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259
    narrow from crm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub
    narrow to crm.service.ejbimpl.ServiceManagerHome
    narrow home
    crm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub@-4611900794319518
    045S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259]
    cast
    homecrm.service.ejbimpl.ServiceManagerBeanHomeImpl_ServiceStub@-461190079431
    9518045S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/259
    Create serviceManager
    crm.service.ejbimpl.ServiceManagerBeanEOImpl_ServiceStub@-461190079431951804
    5S155.161.96.26:[7001,7001,7002,7002,7001,-1] ServiceManagerHome_EO [
    -4611900794319518045S155.161.96.26:[7001,7001,7002,7002,7001,-1]/258

  • PortableRemoteObject.narrow(...) error , why?

    when I execute
    PortableRemoteObject.narrow(objred, SBeanHome.class);
    the system throw an exception
    java.lang.ClassCastException: $Proxy78
    Please help me!
    (my application server is weblogic 6.1)

    Object obj = (MyHomeInterface) ctx.lookup("Invoice.MyHomeInterface");
         MyHomeInterface home = (MyHomeInterface) PortableRemoteObject.narrow(obj, MyHomeInterface.class);
    use this code instead.
    i hope that this will solve your problem change the code according to your classes.

  • PortableRemoteObject.narrow() method

    Hi,
    I usually use this method in case of looking for some remote home interface. But recently I found some EJB examples, where an author ommited the PortableRemoteObject.narrow method. Actually the source code was generated by Lomboz.
    This unusual procedure made me to prepare some tests. I made some EJB bean and its interfaces, after that I made a little change inside on one cpy of home interface, that this one was out of date. In the end I generated appropriate client in two ways:
    - using PortableRemoteObject.narrow method
    - unusing PortableRemoteObject.narrow method
    The results, when I used PortableRemoteObject.narrow method and when I unused it is similar, both resposed by java.lang.ClassCastException
    The small difference was, in order to use PortableRemoteObject.narrow method I got:
    at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(Unknown Source)
         at javax.rmi.PortableRemoteObject.narrow(Unknown Source)
    Ommiting this method I got only;
    java.lang.ClassCastException: $Proxy0
    Well, in both ways I observed the same final exception:
    java.lang.ClassCastException, which good explains what happend wrong. What really is better to use PortableRemoteObject.narrow method based on my above experiences?
    Thank for some suggestions
    Krzysztof

    You need to do the .narrow() method on anything that comes across RMI. The reason is that you have no guarantee that the thing coming across RMI is a Java object. It's possible to send something other than a Java object.
    If your client is using a local interface instead of a remote interface, the narrow() is not required.

  • PortableRemoteObject.narrow Problem

    Hello, I have a jsp that is talking to a servlet that is suppose to connect to a stateless session bean in 9.0.3. The bean deploys fine. I continue to get the following error when the servlet tries to talk to the bean. The servlet works fine on JRun 4 talking to the same bean. Here is my code.
    Hashtable env = new Hashtable();
    env.put(Context.PROVIDER_URL, "ormi://141.254.22.145:23791/JRun2");
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.evermind.server.rmi.RMIInitialContextFactory");
    env.put(Context.SECURITY_PRINCIPAL, "admin");
    env.put(Context.SECURITY_CREDENTIALS, "admin");
    env.put(Context.URL_PKG_PREFIXES, "com.evermind.naming");
    Context context = new InitialContext(env);
    System.out.println("context: " + context.getEnvironment().toString());
    Object o = (Object) context.lookup("SessionManagerLiteStateless");
    System.out.println("o: " + o.toString());
    sessionManagerLiteStatelessHome = (SessionManagerLiteStatelessHome)PortableRemoteObject.narrow(o, SessionManagerLiteStatelessHome.class);
    The context outputs the Home interface fine but it bombs on sessionManagerLiteStatelessHome = (SessionManagerLiteStatelessHome)PortableRemoteObject.narrow(o, SessionManagerLiteStatelessHome.class);
    Here is the error.
    java.lang.ClassCastException
    at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(Unkno
    wn Source)
    at javax.rmi.PortableRemoteObject.narrow(Unknown Source)
    at JRun2.OracleServlet.init(OracleServlet.java:30)
    at com.evermind.server.http.HttpApplication.loadServlet(HttpApplication.
    java:1956)
    at com.evermind.server.http.HttpApplication.findServlet(HttpApplication.
    java:4355)
    at com.evermind.server.http.HttpApplication.getRequestDispatcher(HttpApp
    lication.java:2184)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpReques
    tHandler.java:617)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.ja
    va:259)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.ja
    va:106)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExec
    utor.java:803)
    at java.lang.Thread.run(Unknown Source)

    Michael -
    That looks like a correct set of calls to me.
    Can I ask what environment are you running in? An OC4J standalone or a 9iAS environment?
    ** If this is a 9iAS environment, then the port number for the ORMI lookup will be different than 23791. The actual ORMI port number for a 9iAS instance is dynamically allocated when the OC4J processes are started. The defdault port ranges for ORMI are 3000-3100 by default. The process manager starts at the lower bound and works it's way sequentially along until a free port is found. So usually for the OC4J_Home instance, the ORMI port is 3000.
    I've never used the URL_PKG_PREFIXES myself, what happens if you remove that entry for the Hashtable?
    -steve-

  • A error from javax.rmi.PortableRemoteObject.narrow

    --run envrionment: jdk1.4.2_01 / oc4j9.0.4
    --source code
    import java.util.*;
    import java.io.IOException;
    import java.rmi.RemoteException;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.ejb.*;
    import javax.naming.*;
    import javax.rmi.PortableRemoteObject;
    import java.sql.*;
    public class ProductServlet extends HttpServlet
    server.ProductHome myProductHome;
    public void init() throws ServletException {
    try {
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.evermind.server.rmi.RMIInitialContextFactory");
    env.put(Context.PROVIDER_URL, "ormi://localhost/JDBCEJB");
    env.put(Context.SECURITY_PRINCIPAL, "store_user");
    env.put(Context.SECURITY_CREDENTIALS, "store_password");
    Context myInitialContext = new InitialContext(env);
    Object homeObject = myInitialContext.lookup("ProductBean");
    myProductHome = (server.ProductHome)PortableRemoteObject.narrow(homeObject,server.ProductHome.class);
    } catch(NamingException e) {
    throw new ServletException("Error looking up home", e);
    public void doGet(
    HttpServletRequest request, HttpServletResponse response
    ) throws ServletException, IOException {
    response.setContentType("text/html;charset=BIG5");
    ServletOutputStream out = response.getOutputStream();
    out.println("<html>");
    out.println("<head><title>Product</title></head>");
    out.println("<body>");
    out.println("<table width=100% border=1>");
    out.println("<tr>");
    out.println("<th>Id</th>");
    out.println("<th>Name</th>");
    out.println("<th>Address</th>");
    out.println("<th>Bdate</th>");
    out.println("</tr>");
    try {
    server.ProductRemote myProductRemote = myProductHome.create();
    server.Product myProduct = myProductRemote.query(request.getParameter("guess"));
    if (myProduct != null) {
    out.println("<tr>");
    out.println("<td>" + myProduct.id + "</td>");
    out.println("<td>" + myProduct.name + "</td>");
    out.println("<td>" + myProduct.ads + "</td>");
    out.println("<td>" + myProduct.bdate + "</td>");
    out.println("</tr>");
    out.println("</table>");
    out.println("</body></html>");
    } catch(RemoteException e) {
    out.println("Error communicating with EJB-server: " +
    e.getMessage());
    } catch(CreateException e) {
    out.println("Error creating EJB: " + e.getMessage());
    } catch(SQLException e) {
    out.println("SQL Exception: " + e.getMessage());
    --My application client can run correctly, but my servlet code can't run.
    --If I start oc4j by follow statement:
    java -jar oc4j.jar
    --the error display:
    java.lang.ClassCastException
         at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:293)
         at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:134)
         at ProductServlet.init(ProductServlet.java:39)
         at javax.servlet.GenericServlet.init(GenericServlet.java:258)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.loadServlet(HttpApplication.java:2091)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.findServlet(HttpApplication.java:4507)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.getRequestDispatcher(HttpApplication.java:2410)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:629)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:264)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:107)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186)
         at java.lang.Thread.run(Thread.java:534)
    --If I start oc4j by follow statement:
    java -jar -Djavax.rmi.CORBA.PortableRemoteObjectClass=com.sun.corba.se.internal.javax.rmi.PortableRemoteObject -Djavax.rmi.CORBA.UtilClass=com.sum.corba.se.internal.POA.ShutdownUtilDelegate oc4j.jar
    --the error is:
    java.lang.ExceptionInInitializerError
         at javax.rmi.PortableRemoteObject.createDelegateIfSpecified(PortableRemoteObject.java:179)
         at javax.rmi.PortableRemoteObject.<clinit>(PortableRemoteObject.java:58)
         at ProductServlet.init(ProductServlet.java:39)
         at javax.servlet.GenericServlet.init(GenericServlet.java:258)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.loadServlet(HttpApplication.java:2091)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.findServlet(HttpApplication.java:4507)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.getRequestDispatcher(HttpApplication.java:2410)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:629)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:264)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:107)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186)
         at java.lang.Thread.run(Thread.java:534)
    Caused by: org.omg.CORBA.INITIALIZE: cannot instantiate com.sum.corba.se.internal.POA.ShutdownUtilDelegate vmcid: 0x0 minor code: 0 completed: No
         at javax.rmi.CORBA.Util.createDelegateIfSpecified(Util.java:341)
         at javax.rmi.CORBA.Util.<clinit>(Util.java:51)
         ... 12 more

    --run envrionment: jdk1.4.2_01 / oc4j9.0.4
    --source code
    import java.util.*;
    import java.io.IOException;
    import java.rmi.RemoteException;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.ejb.*;
    import javax.naming.*;
    import javax.rmi.PortableRemoteObject;
    import java.sql.*;
    public class ProductServlet extends HttpServlet
    server.ProductHome myProductHome;
    public void init() throws ServletException {
    try {
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.evermind.server.rmi.RMIInitialContextFactory");
    env.put(Context.PROVIDER_URL, "ormi://localhost/JDBCEJB");
    env.put(Context.SECURITY_PRINCIPAL, "store_user");
    env.put(Context.SECURITY_CREDENTIALS, "store_password");
    Context myInitialContext = new InitialContext(env);
    Object homeObject = myInitialContext.lookup("ProductBean");
    myProductHome = (server.ProductHome)PortableRemoteObject.narrow(homeObject,server.ProductHome.class);
    } catch(NamingException e) {
    throw new ServletException("Error looking up home", e);
    public void doGet(
    HttpServletRequest request, HttpServletResponse response
    ) throws ServletException, IOException {
    response.setContentType("text/html;charset=BIG5");
    ServletOutputStream out = response.getOutputStream();
    out.println("<html>");
    out.println("<head><title>Product</title></head>");
    out.println("<body>");
    out.println("<table width=100% border=1>");
    out.println("<tr>");
    out.println("<th>Id</th>");
    out.println("<th>Name</th>");
    out.println("<th>Address</th>");
    out.println("<th>Bdate</th>");
    out.println("</tr>");
    try {
    server.ProductRemote myProductRemote = myProductHome.create();
    server.Product myProduct = myProductRemote.query(request.getParameter("guess"));
    if (myProduct != null) {
    out.println("<tr>");
    out.println("<td>" + myProduct.id + "</td>");
    out.println("<td>" + myProduct.name + "</td>");
    out.println("<td>" + myProduct.ads + "</td>");
    out.println("<td>" + myProduct.bdate + "</td>");
    out.println("</tr>");
    out.println("</table>");
    out.println("</body></html>");
    } catch(RemoteException e) {
    out.println("Error communicating with EJB-server: " +
    e.getMessage());
    } catch(CreateException e) {
    out.println("Error creating EJB: " + e.getMessage());
    } catch(SQLException e) {
    out.println("SQL Exception: " + e.getMessage());
    --My application client can run correctly, but my servlet code can't run.
    --If I start oc4j by follow statement:
    java -jar oc4j.jar
    --the error display:
    java.lang.ClassCastException
         at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:293)
         at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:134)
         at ProductServlet.init(ProductServlet.java:39)
         at javax.servlet.GenericServlet.init(GenericServlet.java:258)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.loadServlet(HttpApplication.java:2091)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.findServlet(HttpApplication.java:4507)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.getRequestDispatcher(HttpApplication.java:2410)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:629)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:264)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:107)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186)
         at java.lang.Thread.run(Thread.java:534)
    --If I start oc4j by follow statement:
    java -jar -Djavax.rmi.CORBA.PortableRemoteObjectClass=com.sun.corba.se.internal.javax.rmi.PortableRemoteObject -Djavax.rmi.CORBA.UtilClass=com.sum.corba.se.internal.POA.ShutdownUtilDelegate oc4j.jar
    --the error is:
    java.lang.ExceptionInInitializerError
         at javax.rmi.PortableRemoteObject.createDelegateIfSpecified(PortableRemoteObject.java:179)
         at javax.rmi.PortableRemoteObject.<clinit>(PortableRemoteObject.java:58)
         at ProductServlet.init(ProductServlet.java:39)
         at javax.servlet.GenericServlet.init(GenericServlet.java:258)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.loadServlet(HttpApplication.java:2091)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.findServlet(HttpApplication.java:4507)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpApplication.getRequestDispatcher(HttpApplication.java:2410)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:629)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:264)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].server.http.HttpRequestHandler.run(HttpRequestHandler.java:107)
         at com.evermind[Oracle9iAS (9.0.4.0.0) Containers for J2EE].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186)
         at java.lang.Thread.run(Thread.java:534)
    Caused by: org.omg.CORBA.INITIALIZE: cannot instantiate com.sum.corba.se.internal.POA.ShutdownUtilDelegate vmcid: 0x0 minor code: 0 completed: No
         at javax.rmi.CORBA.Util.createDelegateIfSpecified(Util.java:341)
         at javax.rmi.CORBA.Util.<clinit>(Util.java:51)
         ... 12 more

  • PortableRemoteObject.narrow

    Why is it necessary to use and cast the result of this method call, which appears to return the same object as was passed as the first argument? In other words, why do this:
    Object myObj = ctx.lookup(MYHOME);
    MyHome myHome = (MyHome)
    PortableRemoteObject.narrow(myObj, MyHome.class);
    MyEjb myEjb = myHome.create();
    -in code that must know each EJB, when you can do this:
    //In a generic HomeFactory class
    Object myObj = ctx.lookup(MYHOME);
    Class beanHome = Class.forName(MYHOME);
    PortableRemoteObject.narrow(myObj, beanHome);
    return myObj
    //In some other class
    MyHome myHome = (MyHome) HomeFactory.getHome(MYHOME);
    MyEjb = myHome.create();
    I left out the try-catch blocks and all of that for compactness. The reason I ask is because a generic Home Factory can store EJBHome objects in a collection, testing them first and returning them without creating the actual remote reference, so it does not need to know the specific EJB, allowing the specific client code to cast the generic Object to the specific EJBHome object.
    A Sun-certified instructor once told me that it was absolutely necessary to use the Object returned from the narrow method because it performed some essential RMI activity on the object, but I have never had a problem using it the second way I describe above in the HomeFactory. Also, I have never been able to find any documentation to substantiate his claim. Any thoughts as to the necessity of using the object returned from the narrow method? It appears to be the exact same object that is passed in to the method, and likely un-changed at that.

    The narrow method is there to allow an implementation to do some extra work or return a different object if it needs to. It appears that your implementation does not need to do these things so it just returns the object that was passed. If you take your shortcut, you will limit yourself to running only on your current implementation. If you try to switch implementations or even upgrade to a later version it might break. If you follow the correct method the your code will be portable.

  • Confusion in PortableRemoteObject.narrow() method

    In EJB 1.0 reference of home object is obtained through external casting as HelloHome home = (HelloHome)ctx.lookup("HelloHome")
    My question is that since IIOP has not been designed for Java, but for generic languages, and this means that there are some limitations. Some languages, in fact, do not have the concept of casting.
    Still why we have to cast the Object if we use PortableRemoteObject.narrow method for obtaining the home interface reference in EJB2.0.
    HelloHome home = (HelloHome)javax.rmi.PortableRemoteObject.narrow(object, HelloHome.class)

    If the client is built using Java, you can not explicitly cast from the Naming.lookup() function. Instead, you must use lookup() to return a generic java.lang.Object, and then cast to the specific object type with the PortableRemoteObject.Narrow(objectReference, interfaceName) method.

  • HomeInterface.class in PortableRemoteObject.narrow

    Hi
    I understand we do a JNDI look up to get the stub (HomeInterface object) and then narrow it down to ensure the object becomes RMI/IIOP compliant and it is of HomeInterface type, the following code snippet does what I have hence stated
    Context cx = new InitialContext();
    Object obj = cx.lookup("java:comp/env/beanString");
    HomeInterface hI = PortableRemoteObject.narrow(obj, HomeInterface.class) // NOW hI is the STUB object
    I am aware the Home interface will reside in the server side only, the object (obj) that is being returned is of type HomeInterface but then as we are not sure of its RMI/IIOP complaincy we narrow down the object to the Homeinterface type, as the code of HomeInterface resides in the server side how does this snippet (narrowing code) that resides in the client side identify and narrow down, the object returned, to the respective Home Interface type?
    The analogy to this I could think of is ordinary type casting while we pick a object from ArrayList, as all that reside in collection is of type Object we are to typecast to the respective Object type, but here the actual object resides in the JVM so I could understand how this casting happens, but what is the case with PortableRemoteObject.narrow as the Home Interface code resides in the remote server?
    Kindly reply

    Dont you know the concept of "client.jar" ??
    well, the following reside at server side:
    remote interface,
    home interface,
    bean implementation class.
    the following must reside at client side. These are packaged in a jar taht is typically called client.jar:
    remote interface
    home interface
    Check the classpath of your client. I am sure these two interfaces are there in it. Otherwise there will be some exception.
    Note that the system is sensitive to difference in the versions of home/remote. ie. if these are differet, serializationException may be thrown.
    Hope that helps.
    regards

Maybe you are looking for

  • Can I return my iPad (3rd gen) if it has been opened?

    I pre-ordered one of the new iPads and in all the excitement I got a white one because it looked "cool". Now I am having buyers remorse. I plan on using this for lots of movie and TV watching and I know the white bezel isn't great for that. So my que

  • OBIEE 11g performance problem

    Hi, I am facing a performance problem in OBIEE 11g. When I run the query taking from nqquery.log in database, it is giving me the result within few seconds. But In the OBIEE Answers the query runs forever not showing any data. Attaching the query bel

  • How can I update Adobe Acrobat 8.0 Standard

    How can I update Adobe Acrobat 8.0 Standard after installing it on Windows 7? Ive tried a few AcrobatUpd8**_all_incr.msp files but I get an error that the program to upgrade may be missing. I cannot afford to upgrade it to X* when this works for what

  • Methods to send a mail

    Hi, please bear with me, and any mistakes i make, as i'm not that much of an expert in the whole area of mail sending and servers. At the minute our software is using javamail to send mails through a SMTP host. fairly simple, nothing too complicated

  • I have ipad & Mac,same apple ID, How communication use FaceTime between my iPad (out my home) & Mac( in my home)?

    I have ipad & Mac,same apple ID, How I communication use FaceTime by my iPad when I'm out my home to  my wife  ( in  home)?