Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Доступ к JNDI-хранилищу извне


Автор: Се ля ви 4.10.2009, 01:59
Oracle WebLogic позволяет обращаться к JNDI-дереву из внешнего приложения - при чём как класть, так и забирать из него объекты. Выглядит это примерно так:
Ложим -
Код
import javax.naming.*;
import weblogic.jndi.Environment;
import package1.Company;
//...
    public static void main(String args[]) {

        System.out.println("Binding Company object to WebLogic JNDI tree.");
        Company company = new Company();

        try {
            Context ic = getInitialContext();
            Context subcontext = ic.createSubcontext("LabExample");

            subcontext.rebind("Company", company);

            ic.close();

        } catch (Exception e) {
            System.out.println("ERROR: Unable to bind object to JNDI Tree. " + e);
        }

    }

    static Context getInitialContext() {
        Context ic = null;

        try {
            Environment env = new Environment();

            env.setProviderUrl("t3://127.0.0.1:7001");
            env.setSecurityPrincipal("system");
            env.setSecurityCredentials("weblogic");

            ic = env.getInitialContext();

        } catch (Exception e) {
            System.out.println("ERROR - Unable to retrieve InitialContext. " + e);
        } finally {
            return ic;
        }
    }


Тащим так-
Код
public static void main(String args[]) {

        System.out.println("Retrieving Company object from WebLogic JNDI tree.");

        try {
            Context ic = getInitialContext();
            Context subcontext = (Context) ic.lookup("LabExample");

            Object obj = subcontext.lookup("Company");

            if (obj != null) {
                Company company = (Company) obj;

                System.out.println("Context Path: " + subcontext.toString());
                System.out.println("");
                System.out.println("Company Object retrieved.....");
                System.out.println("Company Name: " + company.getName());
            } else {
                System.out.println("Unable to retrieve Company object!.");
            }

            ic.close();

        } catch (Exception e) {
            System.out.println("ERROR: Unable to retrieve object from JNDI Tree. " + e);
        }

    }


Как видим, здесь за взаимодействие отвечает класс http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e13941/weblogic/jndi/Environment.html и протокол t3. Подробнее можно почитать http://download.oracle.com/docs/cd/E12839_01/web.1111/e13730/toc.htm#WJNDI123.
Вопрос - есть ли в стандарте Java EE такие или подобные возможности или хотя бы расширения в других реализациях - скажем, под IBM WebSphere`ой? Или в других реализациях к хранилищу JNDI можно обращаться только изнутри?

Автор: mbasil 5.10.2009, 19:36
Кажется, что всегда можно (во всяком случае в GlassFish я это проделывал).
Только нужно описать сервис провайдера и адрес JNDI хранилища (то есть эту информацию надо выяснить для данного, используемого поставщика).

Можно использовать файл jndi.properties, например с таким содержанием:

Код

java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory
java.naming.provider.url=file:///E:/W_J6/jndi_root

Здесь сервис провайдер обеспечивает хранение в файле.
Или примерно так, как сделали Вы: 
Код

    try {
         Hashtable env = new Hashtable(5);
         env.put( Context.INITIAL_CONTEXT_FACTORY,
                  "com.sun.jndi.fscontext.RefFSContextFactory" );
         env.put( Context.PROVIDER_URL, "file:///E:/W_J6/jndi_root" );
         ctx = new InitialContext( env );
     } catch( NamingException ne ) {
         ne.printStackTrace();
     }

Автор: Се ля ви 5.10.2009, 22:57
Это всё хорошо, но env - это объект какого класса?

Автор: mbasil 6.10.2009, 08:36
Обычный старенький Hashtable

Если Вы "запихнете" все настройки в файл jndi.properties и положите этот файл в правильную директорию, то можно обойтись вариантом:
Код
ctx = new InitialContext();

Автор: ekr 14.10.2009, 18:21
Цитата

Обычный старенький Hashtable


Это weblogic.jndi.Environment.

Добавлено через 2 минуты и 6 секунд
Цитата(Се ля ви @  4.10.2009,  01:59 Найти цитируемый пост)
Вопрос - есть ли в стандарте Java EE такие или подобные возможности или хотя бы расширения в других реализациях - скажем, под IBM WebSphere`ой? Или в других реализациях к хранилищу JNDI можно обращаться только изнутри?

Да, все стандартным образом стоит делать, не связываясь с веблоджиковскими классами.
См. ответ mbasil плюс стандартный туториал по JNDI.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)