web-dev-qa-db-fra.com

Comment rechercher des ressources JNDI sur WebLogic?

J'ai déployé une application héritée sur WebLogic 11g. L'application a le code suivant:

 Context context = new InitialContext();
 dataSource = (javax.sql.DataSource) context.lookup("Java:myDataSource");

J'ai également une source de données configurée dans WebLogic avec le nom JNDI de:

     jdbc/myDataSource

Lorsque le code Java Java s'exécute ci-dessus, j'obtiens l'exception suivante:

       javax.naming.NameNotFoundException: While trying to look up /myDataSource in /app/webapp/axis2.war/60105275.; remaining name '/myDataSource'
        at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.Java:1139)

      at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.Java:144)

Je suis assez nouveau sur JNDI, donc ma question est? Où est la déconnexion dans la dénomination? Qu'est-ce que cela signifie lorsqu'une recherche de contexte a un préfixe "Java:"?

Merci!

9
wsb3383

Vous devriez pouvoir simplement faire ceci:

Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");

Si vous le recherchez à partir d'une destination distante, vous devez utiliser la fabrique de contexte initial WL comme ceci:

Hashtable<String, String> h = new Hashtable<String, String>(7);
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, pURL); //For example "t3://127.0.0.1:7001"
h.put(Context.SECURITY_PRINCIPAL, pUsername);
h.put(Context.SECURITY_CREDENTIALS, pPassword);

InitialContext context = new InitialContext(h);
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");

weblogic.jndi.WLInitialContextFactory

8
Jeff West

Java est l'espace de noms JNDI racine pour les ressources. L'extrait de code d'origine signifie que le conteneur dans lequel l'application a été initialement déployée n'a appliqué aucun espace de noms supplémentaire au contexte JNDI que vous avez récupéré (à titre d'exemple, Tomcat ajoute automatiquement toutes les ressources à l'espace de noms comp/env, Donc vous devrez faire dataSource = (javax.sql.DataSource) context.lookup("Java:comp/env/jdbc/myDataSource"); si le nom de référence de la ressource est jdbc/myDataSource).

Pour éviter d'avoir à changer votre code hérité, je pense que si vous enregistrez la source de données avec le nom myDataSource (supprimez le jdbc/), Ça devrait aller. Faites-moi savoir si cela fonctionne.

6
Femi

Je viens de mettre à jour l'application Weblogic 8 héritée pour utiliser une source de données au lieu d'une chaîne JDBC codée en dur. Le nom JNDI de la source de données sur l'onglet de configuration dans l'administrateur Weblogic a montré: "weblogic.jdbc.ESdatasource", voici deux méthodes qui ont fonctionné:

      Context ctx = new InitialContext();
      DataSource dataSource;

      try {
        dataSource = (DataSource) ctx.lookup("weblogic.jdbc.ESdatasource");
        response.getWriter().println("A " +dataSource);
      }catch(Exception e) {
        response.getWriter().println("A " + e.getMessage() + e.getCause());
      }

      //or

      try {
        dataSource = (DataSource) ctx.lookup("weblogic/jdbc/ESdatasource");
        response.getWriter().println("F "+dataSource);
      }catch(Exception e) {
        response.getWriter().println("F " + e.getMessage() + e.getCause());
      }

      //use your datasource
      conn = datasource.getConnection();

C'est tout le monde. Aucun mot de passe et fabrique de contexte initial nécessaires depuis l'intérieur de l'application Weblogic.

1
wholenewstrain

J'ai eu un problème similaire à celui-ci. Il a été résolu en supprimant le Java:comp/env/ préfixe et utilisation de jdbc/myDataSource dans la recherche de contexte. Tout comme quelqu'un l'a souligné dans les commentaires.

1