title: Why ClassCastException on JMS ConnectionFactory lookup in JNDI?
body: <p>What might be the cause of the following <code>ClassCastException</code> in a standalone JMS client application when it attempts to retrieve a connection factory from the JNDI provider?</p>
  
  <pre><code>Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.jms.ConnectionFactory
  </code></pre>
  
  <p>Here is an abbreviated version of the JMS client that includes only its <code>start()</code> and <code>stop()</code> methods.  The exception occurs on the first line in method <code>start()</code> which attempts to retrieve the connection factory from the JNDI provider, a remote LDAP server.  The JMS connection factory and destination objects are on a remote JMS server.</p>
  
  <pre><code>class JmsClient {
      private ConnectionFactory connectionFactory;
      private Connection connection;
      private Session session;
      private MessageConsumer consumer;
      private Topic topic;
  
      public void stop() throws JMSException {
          consumer.close();
          session.close();
          connection.close();
      }
  
      public void start(Context context, String connectionFactoryName, String topicName) throws NamingException, JMSException {
          // ClassCastException occurs when retrieving connection factory.
          connectionFactory = (ConnectionFactory) context.lookup(connectionFactoryName);
          connection = connectionFactory.createConnection("username","password");
          session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
          topic = (Topic) context.lookup(topicName);
          consumer = session.createConsumer(topic);
          connection.start();
      }
  
      private static Context getInitialContext() throws NamingException, IOException {
          String filename = "context.properties";
          Properties props = new Properties();
          props.load(new FileInputStream(filename));
          return new InitialContext(props);
      }
  }
  </code></pre>
  
  <p>Though I prefer not to disclose the specific contents of <code>context.properties</code>, it contains the following general entries:</p>
  
  <pre><code>java.naming.factory.initial=...
  java.naming.provider.url=...
  java.naming.security.principal=...
  java.naming.security.credentials=...
  </code></pre>