在 Java 企业应用程序中重新映射 JNDI 资源

Remapping JNDI resources in a Java Enterprise Application

我们有一个通用的 Web 模块 (foo.war),我们希望将其作为 WAR 部署在许多不同的 EAR 中。 foo.war 通过 foo 以名称 jdbc/FOO-DATASOURCE

知道的 JNDI 数据源访问数据库

但是对于每个应用程序 XXX,此数据源必须重新映射到与 XXX 应用程序关联的数据源,即 jdbc/XXX-DATASOURCE

foo.war 在其 web.xml 中包含以下内容:

<resource-ref>
    <res-ref-name>jdbc/FOO-DATASOURCE</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

我原以为我可以在 XXX 项目中使用 glassfish-application.xml 中的以下条目来重新映射:

<resource-ref>
    <res-ref-name>jdbc/FOO-DATASOURCE</res-ref-name>
    <jndi-name>jdbc/XXX-DATASOURCE</jndi-name>
</resource-ref>

但是当我将 XXX 应用程序部署到 glassfish 时,我收到消息:

This app [xxx-ear-0.0.1-SNAPSHOT] has no resource reference by the name of [jdbc/FOO-DATASOURCE]
DPL8007: Unsupported deployment descriptors element jndi-name value jdbc/XXX-DATASOURCE

有什么方法可以在 EAR 级别为 web.xml 中定义的资源设置翻译?
glassfish 在哪里寻找资源参考?
有没有更好的方法来完成这个?

事实证明,我可以在 EAR 级别声明资源:在 application.xml 中。我出错的地方是我最初使用的是 application.xml 模式的旧版本。当我将它更改为 version="6" 时,我可以添加一个 resource-ref,然后在 glassfish-application.xml.

中也被 glassfish 接受了

但是有一个复杂的问题:我只能在 application.xml 中声明应用程序级 (java:app/) 资源,而 web.xml 中的数据源是组件级 (java:comp/env/).

为了解决这个问题,我将资源映射到 glassfish-web.xml 中的应用程序级资源,然后将其重新映射到 glassfish-application.xml 中的正确名称:

foo web.xml:

<resource-ref>
  <res-ref-name>jdbc/FOO-DATASOURCE</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>CONTAINER</res-auth>
</resource-ref>

foo glassfish-web.xml:

<resource-ref>
  <res-ref-name>jdbc/FOO-DATASOURCE</res-ref-name>
  <jndi-name>java:app/FOO-DATASOURCE</jndi-name>
</resource-ref>

XXX application.xml(版本=“6”):

<resource-ref>
  <res-ref-name>java:app/jdbc/FOO-DATASOURCE</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>CONTAINER</res-auth>
</resource-ref>

XXX 玻璃鱼-application.xml:

<resource-ref>
  <res-ref-name>java:app/jdbc/FOO-DATASOURCE</res-ref-name>
  <jndi-name>java:app/jdbc/XXX-DATASOURCE</jndi-name>
</resource-ref>

这行得通,但我真的不知道为什么在 web.xml 文件中称为 jdbc/XXX-DATASOURCE 的资源最终等同于在 java:app/jdbc/XXX-DATASOURCE 中称为 java:app/jdbc/XXX-DATASOURCE 的资源=40=] 文件.