WebSphere Liberty 17.0.0.2 を使用しています。
最終製品は、JPA を使用してデータベースにアクセスする jar を含む ear です。
EntityManager には @PersistenceContext のアノテーションが付けられ、永続化ユニット名が定義されています。適切なpersistence-unitの下のpersistence.xmlでは、jta-data-sourceタグにserver.xmlで指定されたデータソース名(直接参照)が含まれています。このセットアップでは、すべてが正常に機能しています。
ここで、データソースの JNDI ルックアップ方法に関して、直接ルックアップから間接ルックアップに切り替える必要が生じました。私が理解しているように、間接参照はOS環境変数のようなものです。名前を使用して構成された値を取得するため、コードに手を加えずにデータソースを切り替えて、そこで JDNI 名を変更できます。
直接から間接に切り替えるには、jta-data-source の persistence.xml に「java:comp/env」を追加する必要があります。
データソース名を間接参照名に接続するにはどうすればよいですか? resource-ref タグを使用して server.xml で指定しようとしましたが、うまくいきませんでした。
ここでの主な目標は、コードで間接ルックアップを使用することですが、アプリケーション サーバー構成でデータソースを変更できるようにすることです。そのため、これが起こっているときにアプリケーションを変更する必要はありません。
構成スニペット:
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
name、binding-name を交換した後の 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 がうまく機能します。