在 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=] 文件.
我们有一个通用的 Web 模块 (foo.war),我们希望将其作为 WAR 部署在许多不同的 EAR 中。 foo.war 通过 foo 以名称 jdbc/FOO-DATASOURCE
但是对于每个应用程序 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
.
但是有一个复杂的问题:我只能在 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=] 文件.