Configuración Avanzada de Recursos JNDI en Apache Tomcat 11

Apache Tomcat 11 ofrece soporte robusto para recursos JNDI (Java Naming and Directory Interface), permitiendo a las aplicaciones web acceder a servicios externos —como bases de datos, sesiones de correo o beans personalizados— mediante una capa de abstracción estandarizada. A diferencia de versiones anteriores, Tomcat 11 refuerza la compatibilidad con las especificaciones Jakarta EE y mejora la seguridad y flexibilidad en la configuración de recursos.

Contexto JNDI por Aplicación

Cada aplicaicón desplegada en Tomcat recibe un InitialContext aislado bajo el espacio de nombres java:comp/env. Este contexto permite referenciar recursos declarados de forma declarativa sin acoplar el código fuente a detalles de implementación.

Declaración en web.xml

En el descriptor de despliegue (/WEB-INF/web.xml), se pueden definir tres tipos de referencias:

  • <env-entry>: Para valores escalares de configuración (ej. maxRetries, debugMode).
  • <resource-ref>: Para recursos que requieren autenticación o configuración avanzada (ej. javax.sql.DataSource).
  • <resource-env-ref>: Para recursos sin credenciales, como fábricas de beans o conexiones JMS simplificadas.

Configuración en context.xml

Cuando se necesita control fino (como tiempos de cierre, instanciación única o parámetros adicionales), se usan elementos específicos de Tomcat dentro del elemento <Context>, ubicado típicamente en META-INF/context.xml:

<Context>
  <Environment name="app/timeoutSeconds" value="30" type="java.lang.Integer" override="true"/>
  <Resource name="bean/ConfigurableService"
            auth="Container"
            type="org.example.service.ConfigService"
            factory="org.apache.naming.factory.BeanFactory"
            maxConnections="10"
            retryDelay="500"/>
  <ResourceLink name="jdbc/SharedPool" global="jdbc/GlobalDataSource" type="javax.sql.DataSource"/>
</Context>

Estos elementos reemplazan o complementan las declaraciones en web.xml. El atributo override="true" permite que los valores definidos aquí anulen los equivalentes en web.xml.

Recursos Globales

Los recursos compartidos entre múltiples aplicaciones se definen en $CATALINA_BASE/conf/server.xml dentro de <GlobalNamingResources>. Para exponerlos a una aplicación específica, se usa <ResourceLink> en su <Context>:

<GlobalNamingResources>
  <Resource name="jdbc/GlobalDataSource"
            auth="Container"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            driverClassName="org.postgresql.Driver"
            url="jdbc:postgresql://localhost:5432/mydb"
            username="appuser"
            password="s3cr3t"/>
</GlobalNamingResources>

Acceso desde Código Java

El uso programático sigue el patrón estándar de JNDI:

try {
  InitialContext initCtx = new InitialContext();
  Context envCtx = (Context) initCtx.lookup("java:comp/env");
  
  // Acceso a un bean personalizado
  ConfigService service = (ConfigService) envCtx.lookup("bean/ConfigurableService");
  
  // Acceso a un pool de conexiones
  DataSource ds = (DataSource) envCtx.lookup("jdbc/SharedPool");
  try (Connection conn = ds.getConnection()) {
    // Ejecutar consultas...
  }
} catch (NamingException e) {
  throw new RuntimeException("Error al resolver recurso JNDI", e);
}

Fábricas Estándar Integradas

Tomcat 11 incluye fábricas predefinidas como:

  • org.apache.naming.factory.BeanFactory: Para instanciar beans JavaBean estándar.
  • org.apache.tomcat.jdbc.pool.DataSourceFactory: Para pools JDBC optimizados.
  • org.apache.naming.factory.TransactionFactory: Para UserTransaction en entornos transaccionales.

Estas fábricas aceptan atributos personalizados que se mapean automáticamente a setters del objeto resultante, con conversión implícita entre String y tipos primitivos o envoltorios.

Seguridad y Restricciones

Como medida de seguridad, Tomcat 11 elimina el atributo forceString usado en versiones anteriores, evitando invocaciones inseguras de métodos setter. Además, solo las fábricas DataSource y UserTransaction cumplen con las especificaciones Jakarta EE; el resto es específico de Tomcat y no portable a otros contenedores.

Etiquetas: tomcat11 JNDI DataSource context-xml JavaEE

Publicado el 10-23 01:19