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: ParaUserTransactionen 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.