2010-02-24 13 views
42

पर JNDI में सभी प्रविष्टियों को सूचीबद्ध करने के किसी भी एक बता सकते हैं या कोड करने के लिए मुझसे बात एक दूरस्थ मशीनकोड रिमोट मशीन

उत्तर

72

यह एक InitialContext की सभी प्रविष्टियों को सूचीबद्ध करने के लिए संभव है में सभी JNDI प्रविष्टियों को सूचीबद्ध करने के कर सकते हैं। आप इस स्निपेट का उपयोग कर सकते हैं: आप किसी अनुप्रयोग सर्वर का उपयोग कर रहे हैं, तो

InitialContext ctx = new InitialContext(); 
NamingEnumeration<NameClassPair> list = ctx.list(""); 
while (list.hasMore()) { 
    System.out.println(list.next().getName()); 
} 

, वहां आमतौर पर JNDI पेड़ ब्राउज़ करने के लिए विकल्प नहीं है।

+2

इस बिल्ला में नहीं पूरा पेड़ करता है। उस उदाहरण के भीतर उपयोगकर्ता ने केवल यही बनाया है। क्या टोमकैट पर ऐसा करने का कोई तरीका है? – John

+0

@ जॉन - जोड़ा गया [निम्नलिखित उत्तर] (http://stackoverflow.com/questions/2324937/code-to-list-all-the-entries-in-jndi-on-remote-machine/37021007#37021007) जो (उम्मीद है) आपके मुद्दे को संबोधित करता है (कभी भी देर से बेहतर नहीं)। –

18

मुझे पता है, पिछले उत्तर से बहुत समय है, लेकिन मुझे एक संदर्भ (टोमी संदर्भ) में उपलब्ध सभी जेडीबीसी डेटासोर्स सूचीबद्ध करने की आवश्यकता है।

मेरे मामले में, मुझे अपने लक्ष्य तक पहुंचने के लिए list("") से अधिक की आवश्यकता है (दुख की बात है, यह मेरे लिए काम नहीं करता)। मैं यहाँ एक नामकरण वातावरण सूची पाया:

Naming Environment for J2EE Application Components

इस के बाद, मैं सभी उपलब्ध JDBC अगले कोड का उपयोग कर संसाधनों झलकी

InitialContext ctx = new InitialContext(); 
NamingEnumeration<NameClassPair> list = ctx.list("java:comp/env/jdbc"); 
while (list.hasMore()) { 
    System.out.println(list.next().getName()); 
} 

सब है कि मिल गया।

मुझे उम्मीद है कि यह मेरी मदद के रूप में किसी और की मदद कर सकता है।

14

पिछले जवाब मुझे "पूरी तस्वीर" (Tomcat7 पर) नहीं दिया, तो मैं एक साथ निम्नलिखित समामेलन है, जो (toString मूल्यों के साथ) एक वृक्ष नक्शा करने के लिए JNDI मूल्यों धर्मान्तरित फेंक दिया गया है:

import javax.naming.*; 
... 

public static Map toMap(Context ctx) throws NamingException { 
    String namespace = ctx instanceof InitialContext ? ctx.getNameInNamespace() : ""; 
    HashMap<String, Object> map = new HashMap<String, Object>(); 
    log.info("> Listing namespace: " + namespace); 
    NamingEnumeration<NameClassPair> list = ctx.list(namespace); 
    while (list.hasMoreElements()) { 
     NameClassPair next = list.next(); 
     String name = next.getName(); 
     String jndiPath = namespace + name; 
     Object lookup; 
     try { 
      log.info("> Looking up name: " + jndiPath); 
      Object tmp = ctx.lookup(jndiPath); 
      if (tmp instanceof Context) { 
       lookup = toMap((Context) tmp); 
      } else { 
       lookup = tmp.toString(); 
      } 
     } catch (Throwable t) { 
      lookup = t.getMessage(); 
     } 
     map.put(name, lookup); 

    } 
    return map; 
} 

उपयोग:

:

toMap(new InitialContext()); 

Tomcat7 में निम्नलिखित उत्पादन देता है

{ "comp": { "env": { "myCustomVar": "foobar" }, "UserTransaction": "Cannot create resource instance", "Resources": { "index.html": "[email protected]", "WEB-INF": { "ibm-web-ext.xml": "[email protected]", "ibm-web-bnd.xml": "[email protected]" } } } } 
0

मैं निम्नलिखित कोड का उपयोग कर रहा (नहीं उत्पादन के लिए):

public void discoverJndi(String path, Context context) throws TestClientException, NamingException { 
    try { 
     NamingEnumeration<NameClassPair> list = context.list(path); 
     while (list.hasMore()) { 
      String name = list.next().getName(); 
      String child = path.equals("") ? name : path + "/" + name; 
      System.out.println(child); 
      discoverJndi(child, context); 
     } 
    } catch (NotContextException e) {} 
} 
+0

हालांकि यह कोड स्निपेट समाधान हो सकता है, [एक स्पष्टीकरण सहित] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answer) वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। – peacetype

संबंधित मुद्दे