[JNDI] Verificar existência ou não de atributo

2 respostas
Rafael_Afonso

Olá:

O pano de fundo é o seguinte: Na minha classe, para definir o datasource, preciso pegar a definição dele no servidor do JNDI. Esta classe (uma subclasse de Action do Struts) pode rodar tanto em Tomcat 3 quanto em Tomcat 4. No Tomcat 4 posso definir o datasource no módulo de administração e então usar o JNDI. Mas no Tomcat 3 não. Daí tenho que passar as configurações do Banco de Dados por outro método que no momento não importa aqui.
Fiz dessa forma:

try {
            Context ctx = new InitialContext();
            if (ctx == null) {
                throw new RuntimeException("FALHA AO CARREGAR O CONTEXTO!");
            }
            ds = (DataSource) ctx.lookup("java:comp/env/ras");
        } catch (NoInitialContextException ex) {
            log.debug("Contexto inexistente");
            ds = null;   
        }catch (NamingException e) {
            throw new RuntimeException("FALHA AO OBTER O DATA SOURCE!", e);
        }

O que pertuba neste caso é ter que usar uma exceção para o caso de não existir o nome que estou procurando. Tive que usar isso pois não achei nenhum método da API que indica se determinado nome existe ou não. Algo como:

if(ctx.existis("java:comp/env/ras")) {
   ds = (DataSource) ctx.lookup("java:comp/env/ras");
} else {
   ds = null;
}

Queria saber como poderia fazer isso sem apelar para usar a NoInitialContextException.

Grato,

2 Respostas

C

Pela API de naming tem que ser assim.
O que pode ser feito é vc implementar um proxy para o contexto de nomes, pois os métodos que as aplicações usam são no pior caso bind, unbind e lookup.
Seria mais ou menos assim :

// todos os imports necessários...

       public class InitialContextProxy {
             private Object lastLookup
             private InitialContext contextDelegate;
             
             public InitialContextProxy( HashTable env ){
                   contextDelegate = new InitialContext( env );
             }
 
             public void bind( String name ) throws NamingException{
                   contextDelegate.bind( name );
             }

             public void unbind( String name ) throws NamingException{
                   contextDelegate.unbind( name );
             }
     
             public boolean isBound( String name ){
                   lastLookup = null
                   try{
                          lastLookup = contextDelegate.lookup(name);
                   }catch( NamingException ignored ){
                   }
                   return lastLookup != null;
             }

             public Object lookup( String name )throws NamingException{
                    lastLookup = contextDelegate.lookup(name);
                    return lastLookup;
             }

             public Object getLastLookup(){
                    return lastLookup;
             }

       }
Vc pode anular outros método convenientes para vc.
Rafael_Afonso

Cláudio:

O único lugar em que teria que fazer essa verificação seria naquele trecho de código que mostrei. Assim vai ficar mesmo do jeito que está. De qualquer forma obrigado. Pode ser útil algum dia, para mim ou para outra pessoa. :wink:

Grato,

Criado 11 de junho de 2004
Ultima resposta 11 de jun. de 2004
Respostas 2
Participantes 2