2009-08-28 4 views
3

La deuxième recherche JNDI dans le code ci-dessous échoue avec une exception lors de l'exécution en tant qu'application autonome sur Glassfish (qui a été configuré pour exposer un QueueConnectionFactory et un DataSource via JNDI). Toutefois, le code fonctionne correctement lorsque la ligne jndiContext.close() est supprimée.Pourquoi appeler close() sur un InitialContext rompt JNDI pour toutes les recherches futures (Glassfish)?

Dans le code réel, l'appel à close() est fait par Spring dans un JndiObjectFactoryBean, donc je ne peux pas facilement le supprimer.

Est-ce un bug dans Glassfish, ou est-ce que je fais quelque chose de mal (par exemple une mauvaise configuration ou un codage incorrect)?

import javax.naming.Context; 
import javax.naming.InitialContext; 

public class TestInitCtx { 
    private final static String QUEUE_CONNECTION_FACTORY_JNDI_NAME = "QCF"; 
    private final static String DATA_SOURCE_JNDI_NAME = "DS"; 

    public static void main(String[] args) throws Exception { 
     Context jndiContext = new InitialContext(); 
     jndiContext.lookup(QUEUE_CONNECTION_FACTORY_JNDI_NAME); 

     // In Glassfish, this line causes the second lookup 
     // to throw a com.sun.enterprise.connectors.ConnectorRuntimeException 
     // (wrapping a NullPointerException) 
     jndiContext.close(); 

     jndiContext = new InitialContext(); 
     jndiContext.lookup(DATA_SOURCE_JNDI_NAME);   
    } 
} 

Répondre

0

Votre implémentation JNDI peut uniquement prendre en charge une implémentation statique unique de l'objet InitialContext. Vous pouvez utiliser la documentation au sun pour déterminer comment déterminer le type concret réel de la fabrique de contexte JNDI, puis rechercher les documents d'implémentation qui détaillent la fermeture.

+0

OK, mais Spring appelle close() sur le contexte pour moi. Dois-je renoncer à utiliser Spring si mon objet InitialContext est l'un de ces objets statiques? –

Questions connexes