A JNDI ou Java Naming and Directory Interface é uma API para acesso a serviços de diretórios. Ela permite que aplicações cliente descubram e obtenham dados ou objetos através de um nome. Assim como todas as APIs Java, ela é independente de plataforma. Adicionalmente, ela especifica uma interface de serviço (SPI), que permite que softwares de serviço de diretório suportem o seu framework. A solução de diretório pode ser baseada em rede, arquivos ou base de dados, sendo apenas uma questão de escolha do fornecedor do produto.

A API JNDI é utilizada em aplicações Java que acessam recursos externos, como base de dados, filas ou tópicos JMS e componentes JavaEE. Os administradores do sistema gravam objetos administrados num serviço de diretório disponibilizado pelo servidor de aplicações (normalmente); a aplicação busca estes objetos através da JNDI (lookup). A API disponibiliza:

  • um mecanismo para ligar um objeto a um nome;
  • uma interface padronizada de busca de objetos no serviço de diretório;
  • uma interface de eventos que permite que um usuário saiba quando uma entrada (nome + objeto) foi modificada;
  • extensões que suportam as capacidades do padrão LDAP.

A SPI permite que a JNDI suporte praticamente qualquer tipo de serviço de diretório incluindo:

A especificação JNDI foi lançada em 10 de março de 1997 pela Sun Microsystems. A versão atual da JNDI é 1.2.

Lookup básico editar

A JNDI organiza os nomes em uma hierarquia. Um nome pode ser qualquer string, como "org.mydomain.ejb.MyBean". Um nome também pode ser um objeto que suporte a interface Name, porém os objetos são normalmente nomeados através de strings. Cada nome na hierarquia JNDI corresponde a um objeto (ou uma referência deste objeto) gravado no serviço de diretório.

A JNDI define um contexto que especifica onde procurar pelo objeto. O contexto inicial é tipicamente utilizado como ponto de partida.

O contexto inicial é análogo a raiz, ou topo, de uma árvore de diretórios ou sistema de arquivos. Um exemplo de criação de um contexto inicial num trecho de programa em Java:

    Hashtable args = new Hashtable();
    //Inicialmente e necessario definir a classe ''factory'' do contexto 
    args.put( Context.INITIAL_CONTEXT_FACTORY, "com.jndiprovider.TheirContextFactory");
    //O próximo argumento é a URL definindo a localização do objeto:
    args.put( Context.PROVIDER_URL, "http://jndiprovider-database");
    //Finalmente é criado o contexto inicial
    Context myCurrentContext = new InitialContext( args );

Através do objeto de contexto (Context) é realizada a busca (lookup) pelo objeto de nome org.mydomain.ejb.MyBean. Um exemplo:

    Object obj = myCurrentContext.lookup( "org.mydomain.ejb.MyBean" );
    //este passo e necessario para EJBs.
    MyBean myBean = (MyBean) PortableRemoteObject.narrow( reference, MyBean.class );

Buscando editar

Os diretórios são uma espécie de contexto, eles restringem o espaço da busca (namespace) da mesma maneira que faz uma estrutura de diretórios de um sistema de arquivos.

Ligações externas editar