Para que é usado o resource-ref em web.xml?

112

Só estou me perguntando quando / por que você definiria um <resource-ref>elemento em seu web.xmlarquivo?

Eu teria pensado que seria definido em seu servidor web / app usando JNDI e, em seguida, procurar a referência JNDI em seu código Java?

A definição de referência de recurso parece um pouco redundante para mim e não consigo pensar em quando ela pode ser útil. Exemplo:

<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
fonte

Respostas:

156

Você sempre pode se referir aos recursos em seu aplicativo diretamente por seu nome JNDI, conforme configurado no contêiner, mas se fizer isso, essencialmente, você estará conectando o nome específico do contêiner em seu código. Isso tem algumas desvantagens, por exemplo, se você quiser alterar o nome posteriormente por algum motivo, precisará atualizar todas as referências em todos os seus aplicativos e, em seguida, reconstruí-los e reimplementá-los.

<resource-ref>introduz outra camada de indireção: você especifica o nome que deseja usar no web.xml e, dependendo do contêiner, fornece uma ligação em um arquivo de configuração específico do contêiner .

Então aqui está o que acontece : digamos que você queira pesquisar o java:comp/env/jdbc/primaryDBnome. O contêiner descobre que web.xml tem um <resource-ref>elemento para jdbc/primaryDB, então ele examinará a configuração específica do contêiner, que contém algo semelhante ao seguinte:

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

Finalmente, ele retorna o objeto registrado com o nome de jdbc/PrimaryDBInTheContainer.

A ideia é que especificar recursos no web.xml tem a vantagem de separar a função de desenvolvedor da função de implantador . Em outras palavras, como desenvolvedor, você não precisa saber como seus recursos necessários são realmente chamados na produção e, como o cara que implementa o aplicativo, você terá uma boa lista de nomes para mapear para recursos reais.

candiru
fonte
6
IMHO, vai além de separar os papéis. A ideia é que você não pode assumir que um nome jndi está disponível em um servidor, então você precisa de uma maneira de mapear o nome usado em seu aplicativo no nome JNDI "real" escolhido pelo implementador.
Pascal Thivent
3
Deve ser elementar, já que não consigo encontrá-lo com o Google, mas se eu quiser pesquisar "java: comp / env / jdbc / primaryDB", por que o nome res-ref é "jdbc / primaryDB"?
Torben
4
Pelo que eu sei, o elemento "jndi-name" NÃO faz parte do web.xml padrão, mas sim de descritores de implantação de fornecedores específicos.
Ramon Chiara
2
@RaviParekh, ele mencionou "configuração específica do contêiner", pode ser jboss-web.xml ou weblogic.xml ou qualquer outro arquivo descritor de implantação específico do fornecedor
abhihello123
1
Podemos relacionar isso com o Tomcat? Quero dizer datasource definido em context.xml no tomcat e resource-ref em web.xml
Atul