【问题标题】:How to set up indirect JNDI lookup in WebSphere Liberty?如何在 WebSphere Liberty 中设置间接 JNDI 查找?
【发布时间】:2018-08-24 07:56:53
【问题描述】:

我正在使用 WebSphere Liberty 17.0.0.2。

最终产品是一个耳朵,其中包含一个使用 JPA 访问数据库的 jar。

EntityManager 使用 @PersistenceContext 注释,并定义了持久性单元名称。在适当的持久性单元下的持久性.xml 中,jta-data-source 标记包含 server.xml 中指定的数据源名称(直接查找)。通过此设置,一切正常。

现在需要我需要从直接查找切换到关于数据源 JNDI 查找方法的间接查找。据我了解,间接查找类似于操作系统环境变量。我使用名称来获取配置的值,因此我可以切换数据源而无需触摸我的代码来重命名 JDNI 名称。

从直接切换到间接我需要在我的 persistence.xml 中为 jta-data-source 附加“java:comp/env”。

如何将数据源名称与间接查找名称联系起来?我尝试使用 resource-ref 标记在 server.xml 中指定它,但没有成功。

这里的主要目标是在代码中使用间接查找,但能够更改应用程序服务器配置中的数据源,因此我不必在发生这种情况时更改我的应用程序。

配置sn-ps:

server.xml
<library id="oraclelib">
<jdbcDriver id="oracledriver" libraryRef="oraclelib">
<dataSource jndiName="jdbc/oradb" jdbcDriverRef="oracledriver" id="oradbds">
<resource-ref name="jdbc/oradb" binding-name="jdbc/mydb">

persistence.xml
<jta-data-source>java:comp/env/jdbc/mydb</jta-data-source>

运行此设置时会抛出 javax.naming.NameNotFoundException。

更新 #1

交换名称后的server.xml,绑定名称

<?xml version="1.0" encoding="UTF-8"?>
<server description="app server">
  <library id="OracleLib">
    <fileset dir="/oracle" includes="ojdbc6.jar" />
  </library>
  <jdbcDriver id="OracleJDBCDriver" libraryRef="OracleLib" />
  <dataSource jndiName="jdbc/oradb" jdbcDriverRef="OracleJDBCDriver" id="dbDataSource">
    <properties.oracle URL="jdbc:oracle:thin:@//dbhost:port/SID" user="dbuser" password="dbpassword" />
  </dataSource>
  <application id="Myapp_ear" location="/path/myapp.ear" name="Myapp_ear" type="ear">
    <application-bnd>
      <resource-ref name="jdbc/mydb" binding-name="jdbc/oradb" />
    </application-bnd>
  </application>
</server>

jta-data-source 是 java:comp/env/jdbc/mydb

解决方案

原来用于获取 EntityManager 的 bean 是 CDI bean。因为它被修改为一个 EJB bean,所以 ejb-jar.xml、ibm-ejb-jar-bnd.xml 做到了。

【问题讨论】:

  • 您是否将&lt;resource-ref/&gt; 定义为server.xml 中的顶级元素?只有嵌套在&lt;application&gt;&lt;application-bnd&gt;&lt;resource-ref&gt;下为你的应用才有效,也可以直接放到你应用的web.xml中
  • 是的,resource-ref 是顶级元素。我按照您的建议进行了修改,但不幸的是它没有帮助。现在是:/server/application/application-bnd/resource-ref。我尝试了 java:comp/env/[...] 和 java:app/env/[...]。

标签: java websphere jndi websphere-liberty open-liberty


【解决方案1】:

应该是相反的:

不是

 <resource-ref name="jdbc/oradb" binding-name="jdbc/mydb">

但是

<resource-ref name="jdbc/mydb" binding-name="jdbc/oradb">

name - 是资源引用名称,binding-name 是服务器配置中的 jndi 名称。

【讨论】:

  • 我交换了名字,但仍然抛出 NameNotFoundException。我用 Update #1 更新了问题,以显示在将资源引用从顶层移动到应用程序和名称交换之后 server.xml 现在的样子。
  • @bdz 好的,我想我记得问题出在哪里。您是否在给定模块(web.xml 或 ejb-jar.xml)的部署描述符中定义了资源引用?如果没有,你可以做两件事。 1)将@Resource注解添加到你有@PersistenceContext的类或2)在部署描述符中定义resource-ref。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多