サラリーマン技術者の調査レポート

日々の業務で気付いた当たり障りのない技術的なあれこれを綴ります。

WildFly8.1でJPAのデータソースを間接参照する方法

WildFly8.1でJPAのデータソースを環境名前空間を使って間接参照する方法です。

WASなんかだと特に何も考えなくても勝手に動いてしまうのですが、WildFlyでは一捻り必要だったので記録しておきます。

問題点

JPA<jta-datasource />WildFlyに設定したデータソースのJNDI名をそのまま指定したくない(理由は省略)ので、java:appといったローカルな環境名前空間を指定したが、アプリケーションをデプロイするとエラーが出て動作しない。

動かないのは以下のような設定です。

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd"
 version="7">

 <display-name>test-ear</display-name>
 <module>
  <web>
   <web-uri>test-0.0.1-SNAPSHOT.war</web-uri>
   <context-root>/test</context-root>
  </web>
 </module>
 <library-directory>lib</library-directory>

 <resource-ref>
  <res-ref-name>java:app/jdbc/TestDS</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <lookup-name>java:jboss/datasources/TestDS</lookup-name>
 </resource-ref>

</application>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
 xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
 <persistence-unit name="test">
  <jta-data-source>java:app/jdbc/TestDS</jta-data-source>
 </persistence-unit>
</persistence>

解決策

application.xmlよりpersistence.xmlが先に初期化されてるような気がするなぁ、とかモヤモヤしてたのですが、あっさり解決策が見つかりました。

[wildfly-dev] How to deal with resource refs when deploying JPA container managed entity managers (WFLY-2841)

単に検索しただけですが、、

どうやらpersistence.xmlにプロパティを1個追加すればOKなようです。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
 xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
 <persistence-unit name="test">
  <jta-data-source>java:app/jdbc/TestDS</jta-data-source>
  <properties>
   <property name="wildfly.jpa.twophasebootstrap" value="false" />
  </properties>
 </persistence-unit>
</persistence>

ということで動きました。

ポイントはwildfly.jpa.twophasebootstrap=falseにすることでした。

今回はjava:app名前空間だけで試しましたが、java:modulejava:compも同じ要領で動くと思います。

以上で終了です。