¿Para qué se utiliza resource-ref en web.xml?

112

Me pregunto cuándo / por qué definiría un <resource-ref>elemento en su web.xmlarchivo.

Hubiera pensado que se definiría en su servidor web / de aplicaciones utilizando JNDI y luego buscaría la referencia JNDI en su código Java.

La definición de referencia de recursos me parece un poco redundante y no puedo pensar en cuándo podría ser útil. Ejemplo:

<resource-ref>
  <description>Primary database</description>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>CONTAINER</res-auth>
</resource-ref>
JMM
fuente

Respuestas:

156

Siempre puede hacer referencia a los recursos en su aplicación directamente por su nombre JNDI como está configurado en el contenedor, pero si lo hace, esencialmente está conectando el nombre específico del contenedor en su código. Esto tiene algunas desventajas, por ejemplo, si alguna vez desea cambiar el nombre más adelante por alguna razón, deberá actualizar todas las referencias en todas sus aplicaciones y luego reconstruirlas y volver a implementarlas.

<resource-ref>introduce otra capa de direccionamiento indirecto: usted especifica el nombre que desea usar en web.xml y, según el contenedor, proporciona un enlace en un archivo de configuración específico del contenedor .

Entonces, esto es lo que sucede : digamos que desea buscar el java:comp/env/jdbc/primaryDBnombre. El contenedor encuentra que web.xml tiene un <resource-ref>elemento para jdbc/primaryDB, por lo que buscará en la configuración específica del contenedor, que contiene algo similar a lo siguiente:

<resource-ref>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <jndi-name>jdbc/PrimaryDBInTheContainer</jndi-name>
</resource-ref>

Finalmente, devuelve el objeto registrado con el nombre de jdbc/PrimaryDBInTheContainer.

La idea es que especificar recursos en web.xml tiene la ventaja de separar el rol de desarrollador del rol de implementador . En otras palabras, como desarrollador, no tiene que saber cómo se llaman realmente los recursos necesarios en producción, y como el tipo que implementa la aplicación, tendrá una buena lista de nombres para asignarlos a recursos reales.

candiru
fuente
6
En mi humilde opinión, va más allá de separar los roles. La idea es que no puede suponer que un nombre jndi está disponible en un servidor, por lo que necesita una forma de asignar el nombre utilizado en su aplicación al nombre JNDI "real" elegido por el implementador.
Pascal Thivent
3
Esto debe ser elemental, ya que no puedo encontrarlo con Google, pero si quiero buscar "java: comp / env / jdbc / primaryDB", ¿por qué el res-ref-name es "jdbc / primaryDB"?
Torben
4
Por lo que sé, el elemento "jndi-name" NO es parte del web.xml estándar, sino de descriptores de implementación de proveedores específicos.
Ramon Chiara
2
@RaviParekh, ha mencionado "configuración específica del contenedor", podría ser jboss-web.xml o weblogic.xml o cualquier otro archivo descriptor de implementación específico del proveedor
abhihello123
1
¿Podemos relacionar esto con Tomcat? Me refiero a la fuente de datos definida en context.xml en tomcat y resource-ref en web.xml
Atul