Glassfish: Невозможно сопоставить имя JNDI источника данных с переносимым именем с помощью glassfish-web.xml

Я схожу с ума, пытаясь сделать веб-приложение Java EE 6 переносимым между Glassfish AS 3.x и JBoss AS 6 (и 7, когда оно будет выпущено).

Поскольку каждый сервер сопоставляет имена JNDI для источников данных по-разному, мне нужно указать частное внутреннее имя приложения для источника данных в persistence.xml, а затем использовать glassfish-web.xml или jboss-web.xml (в зависимости от ситуации), чтобы сопоставить это с реальное имя источника данных на сервере.

Теория проста (ну, для EE):

  • Используйте внутреннее имя в persistence.xml, например, "my-datasource"
  • Добавьте ссылку ресурса в сеть .xml, объявляющий, что вашему приложению требуется ресурс под названием «my-datasource»
  • . Добавьте сопоставление в glassfish-web.xml и jboss-web.xml с соответствующим синтаксисом сервера, объявив, что «my-datasource» должен быть сопоставлен с сервер приложений предоставил источник данных с именем «real-DS-created-by-admin»

К сожалению, теория далеко не исчерпывающая, потому что, хоть убей, я nне заставить его работать в Glassfish AS 3.1, 3.1.1, 3.2 beta, JBoss AS 6 или JBoss AS 7 beta. Прямо сейчас я сосредоточен на том, чтобы заставить его работать на Glassfish.

Glassfish сообщает «Недопустимый ресурс: my-datasource__pm», когда я пытаюсь развернуть приложение, которое ссылается на «my-datasource» в persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="org.example_glassfish-webxml-datasource-jndi-mapping_war_1.0-SNAPSHOTPU" transaction-type="JTA">
    <jta-data-source>my-datasource</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

и отображает его в известный существующий источник данных через web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"     
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <!-- servlet declarations etc elided ... --> 

    <resource-ref>
        <res-ref-name>my-datasource</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>

</web-app>

... и glassfish-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <resource-ref>
    <res-ref-name>my-datasource</res-ref-name>
    <jndi-name>realdsname</jndi-name>
  </resource-ref>
</glassfish-web-app>

«asadmin list-jndi-entries» показывает фактическое имя JNDI источника данных точно так, как оно отображается в glassfish-web. xml, а также перечисление другой записи с суффиксом «__pm», созданной Glassfish:

$ asadmin list-jndi-entries
.... unrelated output ....
realdsname__pm: javax.naming.Reference
realdsname: javax.naming.Reference

Излишне говорить, что это полностью меня заводит. Есть идеи, что мне не хватает?

6
задан Craig Ringer 12 July 2011 в 06:43
поделиться