6 Replies Latest reply: Nov 16, 2007 10:53 PM by lich king RSS

    javax.naming.NamingException: Could not dereference object -

    Helen Tran Newbie

      Hi All,

      I am receiving the following error when trying to reference 2 Stateful Session beans (TransactionPersistenceContext & ExtendedPersistenceContext):

      -------------------------------------------------------------------------
      Distributing D:\Test\EJB3ex511-client\dist\EJB3ex511-client.jar to [org.jboss.deployment.spi.LocalhostTarget@13aaba1]
      Deploying D:\Test\EJB3ex511-client\dist\EJB3ex511-client.jar
      Deploying D:\Test\EJB3ex511-client\dist\EJB3ex511-client.jar
      Applicaton Deployed
      Operation start started
      Operation start completed
      run-deploy:
      run-tool:
      run-jar:
      log4j:WARN No appenders could be found for logger (org.jboss.security.SecurityAssociation).
      log4j:WARN Please initialize the log4j system properly.
      no cabin should be null: null
      Master Suite
      1
      1
      3
      Updating detached cabin instance with new bed count of 4
      Finding cabin to see it has been updated with a merge() on server
      new bed count is: 4
      javax.naming.NamingException: Could not dereference object [Root exception is java.lang.reflect.UndeclaredThrowableException]
      at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1150)
      at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:705)
      at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
      at javax.naming.InitialContext.lookup(InitialContext.java:392)
      at ejb3ex511client.Main.main(Main.java:50)
      Caused by: java.lang.reflect.UndeclaredThrowableException
      at $Proxy1.createProxy(Unknown Source)
      at org.jboss.ejb3.JndiProxyFactory.getObjectInstance(JndiProxyFactory.java:52)
      -------------------------------------------------------------------------------
      Here are the codes for 1 Stateless (TravelAgentBean - pre-requisite) & 1 Stateful (TransactionPersistenceContextBean) session beans and a Client manipulating these beans:

      @Stateless
      public class TravelAgentBean implements TravelAgentRemote
      {
       @PersistenceUnit(unitName="EJB3ex51") private EntityManagerFactory factory;
       @PersistenceContext(unitName="EJB3ex51") private EntityManager manager;
      
       public void createCabin(Cabin cabin)
       {
       manager.persist(cabin);
       }
      
       public Cabin findCabin(int pKey)
       {
       return manager.find(Cabin.class, pKey);
       }
      
       public void updateCabin(Cabin cabin)
       {
       manager.merge(cabin);
       }



      @Stateful
      public class TransactionPersistenceContextBean implements TransactionPersistenceContextRemote
      {
       @PersistenceContext(unitName="titan", type=PersistenceContextType.TRANSACTION)
       private EntityManager manager;
      
       private Cabin cabin;
      
       public void setCabin(int pk)
       {
       cabin = manager.find(Cabin.class, pk);
       }
      
       public void updateBedCount(int newBedCount)
       {
       cabin.setBedCount(newBedCount);
       }
      
       @Remove
       public void remove()
       {
       }
      }


      public static void main(String[] args) {
      
       try
       {
       Context jndiContext = getInitialContext();
       Object ref = jndiContext.lookup("travelagent.TravelAgentRemote");
       TravelAgentRemote dao = (TravelAgentRemote)ref;
      
       Cabin noCabin = dao.findCabin(1);
       System.out.println("no cabin should be null: " + noCabin);
      
       Cabin cabin_1 = new Cabin();
       cabin_1.setId(1);
       cabin_1.setName("Master Suite");
       cabin_1.setDeckLevel(1);
       cabin_1.setShipId(1);
       cabin_1.setBedCount(3);
      
       dao.createCabin(cabin_1);
      
       Cabin cabin_2 = dao.findCabin(1);
       System.out.println(cabin_2.getName());
       System.out.println(cabin_2.getDeckLevel());
       System.out.println(cabin_2.getShipId());
       System.out.println(cabin_2.getBedCount());
      
       System.out.println("Updating detached cabin instance with new bed count of 4");
       cabin_2.setBedCount(4);
       dao.updateCabin(cabin_2);
      
       System.out.println("Finding cabin to see it has been updated with a merge() on server");
       Cabin cabin_3 = dao.findCabin(1);
       System.out.println("new bed count is: " + cabin_3.getBedCount());
      
       ref = jndiContext.lookup("travelagent.TransactionPersistenceContextRemote");
       TransactionPersistenceContextRemote txBean = (TransactionPersistenceContextRemote)ref;
      
       Cabin fetchedCabin = dao.findCabin(1);
       int oldBedCount = fetchedCabin.getBedCount();
      
       System.out.println("Set up transaction persistence context stateful bean");
       txBean.setCabin(1);
       txBean.updateBedCount(5);
      
       fetchedCabin = dao.findCabin(1);
       System.out.println("Cabin bed count will still be " + oldBedCount + ": " + fetchedCabin.getBedCount());
      
       System.out.println("Set up extended persistence context stateful bean");
      
       ref = jndiContext.lookup("travelagent.ExtendedPersistenceContextRemote");
       ExtendedPersistenceContextRemote extendedBean = (ExtendedPersistenceContextRemote)ref;
      
       extendedBean.setCabin(1);
       extendedBean.updateBedCount(5);
      
       fetchedCabin = dao.findCabin(1);
       System.out.println("Cabin bed count will be 5: " + fetchedCabin.getBedCount());
      
       // cleanup
       txBean.remove();
       extendedBean.remove();
      
       }
       catch (javax.naming.NamingException ne)
       {
       ne.printStackTrace();
       }
       }
      
       public static Context getInitialContext()
       throws javax.naming.NamingException
       {
       return new javax.naming.InitialContext();
       }


      I have tried to split the client into separate classes but the outcome is still the same.

      I am running Netbeans 5.5, JBoss 4.0.5 AS on Windows XP platform.

      I have struggled with this issue for many days after trying different method of deployment including using both sun-appserver-pe9.0 & JBoss 4.0.5 AS without success.

      This exercise is from workbook (ex05_1), title EJB 3.0 by Bill Burke.

      Any assistance would be very much appreciated.

      Thanks,

      Henry

        • 1. Re: javax.naming.NamingException: Could not dereference obje
          Helen Tran Newbie

          Hi,

          I managed to overcome this issue by carrying out the the following changes which worked on Sun System Java Application Server PE 9.0 only:

          ( i ) Re-create a single titan ejb project to include all 3 session beans (TravelAgent, TransactionPersistenceContext, ExtendedPersistenceContext) & 1 entity class (Cabin) in one titan.jar file. More importantly, have all classes pointing to 1 persistence unit (titan).

          The persistence.xml file was the root to my problem.

          ( ii ) Re-create Client with these syntax:

          ref = jndiContext.lookup("travelagent.TransactionPersistenceContextRemote");
          ref = jndiContext.lookup("travelagent.ExtendedPersistenceContextRemote");

          As a result, the Client output from Netbeans is:

          no cabin should be null: null
          Master Suite
          1
          1
          3
          Updating detached cabin instance with new bed count of 4
          Finding cabin to see it has been updated with a merge() on server
          new bed count is: 4
          Set up transaction persistence context stateful bean
          Cabin bed count will still be 4: 4
          Set up extended persistence context stateful bean
          Cabin bed count will be 5: 5

          However, I still could not find a solution when running in JBoss AS 4.0.5.

          Thanks,

          Henry

          • 2. Re: javax.naming.NamingException: Could not dereference obje
            Helen Tran Newbie

            Hi All,

            Could someone please help me with this issue?

            I still could not identify what the problem for so many weeks.

            Thanks,

            Henry

            • 3. Re: javax.naming.NamingException: Could not dereference obje
              Ken Sloan Newbie

              I'm having a similar problem with ex05_1. Client_1 runs fine, but Client_2 gives the same error when it tries to bind to TransactionPersistenceContextBean/remote. The first bind to TravelAgentBean/remote works with no problem.

               public static void main(String [] args)
               {
               try
               {
               Context jndiContext = getInitialContext();
               Object ref = jndiContext.lookup("TravelAgentBean/remote");
               TravelAgentRemote dao = (TravelAgentRemote)ref;
              
              
               ref = jndiContext.lookup("TransactionPersistenceContextBean/remote");
               TransactionPersistenceContextRemote txBean = (TransactionPersistenceContextRemote)ref;
              
               Cabin fetchedCabin = dao.findCabin(1);
               int oldBedCount = fetchedCabin.getBedCount();
              

              I want to stress here that I am running the code "out of the box". Straight from the download with no modifications. No problems with all the previous exercises.

              Any help would be greatly appreciated.

              • 4. Re: javax.naming.NamingException: Could not dereference obje
                Ken Sloan Newbie

                Here's some additional information. I don't understand it...perhaps someone here will.

                I went into the TransactionPersistenceContextBean and changed it from Stateful to Stateless, and it bound the TransactionPersistenceContextBean fine, but gave me the error on ExtendedPersistenceContextBean.

                So, I changed ExtendedPersistenceContextBean to Stateless. This time, it crashed with
                javax.naming.NameNotFoundException: ExtendedPersistenceContextBean not found

                So, just for grins, I changed the ExtendedPersistenceContextBean from
                type=PersistenceContextType.EXTENDED
                to
                type=PersistenceContextType.TRANSACTION
                and it ran all the way through with no problems. Of course, it's not what was intended, but what was intended DOESN'T FREAKING WORK!!! (that's right....all caps means shouting in forum-land).

                I think O'Reilly writes a great book and JBOSS is a great product, but by the 5th edition, you'd think they'd at least have the bugs out of the example code.

                Now, if it turns out I've somehow caused the problem, I will happily (albeit embarrassedly) retract this. But, as mentioned above, I started with it straight from download and ran all previous examples with no problems.

                Can anyone please shed some light on this?

                • 5. Re: javax.naming.NamingException: Could not dereference obje
                  Tom Clifford Newbie

                  I had this trouble too, and I found that I had to create a jboss.xml
                  under resources\META-INF for each example in the book (I'm up to
                  ch07 currently).

                  The one for ch05_1 is:

                  <jboss>
                   <enterprise-beans>
                   <session>
                   <ejb-name>TravelAgentBean</ejb-name>
                   <jndi-name>TravelAgentRemote</jndi-name>
                   </session>
                   <session>
                   <ejb-name>TransactionPersistenceContextBean</ejb-name>
                   <jndi-name>TransactionPersistenceContextRemote</jndi-name>
                   </session>
                   <session>
                   <ejb-name>ExtendedPersistenceContextBean</ejb-name>
                   <jndi-name>ExtendedPersistenceContextRemote</jndi-name>
                   </session>
                   </enterprise-beans>
                   <resource-ref>
                   <res-ref-name>jdbc/MySqlWorkbookDS</res-ref-name>
                   <resource-name>MySqlWorkbookDS</resource-name>
                   </resource-ref>
                  </jboss>
                  


                  ...I built this into the 'titan-ejb.jar' that I created just to hold the
                  class files from 'domain' and 'travelagent', but not 'clients'.
                  I created a separate 'titan-client.jar' with the client class files.

                  The datasource for mysql, in <resource-ref> above, I had to set up with
                  a 'mysql-ds.xml' file in the jboss deploy dir.

                  This took care of the errors I would get. In the clients, of course, you
                  also have to use:

                   Object ref = jndiContext.lookup("TravelAgentRemote");
                  


                  instead of:

                   Object ref = jndiContext.lookup("TravelAgentBean/remote");
                  


                  when using the above jboss.xml.
                  I could not find another way to get JNDI to see the remote interface.

                  Tom.