Я немного схожу с ума, пытаясь сделать переносимое веб-приложение 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"
- Добавьте запись resource-ref в web.xml, заявляющую, что вашему приложению нужен ресурс под названием «my-datasource»
- Добавьте сопоставление в glassfish-web.xml и jboss-web.xml с синтаксисом соответствующего сервера, заявив, что «my-datasource» должен быть сопоставлен с сервером приложений при условии источника данных с именем «real-DS-made-by» -admin "
К сожалению, теория примерно так далеко, потому что я не могу заставить ее работать в 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-records" отображает фактическое имя JNDI источника данных в точности так, как оно отображается в glassfish-web.xml, а также выводит другую запись с суффиксом "__pm", сгенерированным Glassfish:
$ asadmin list-jndi-entries
.... unrelated output ....
realdsname__pm: javax.naming.Reference
realdsname: javax.naming.Reference
Само собой разумеется, это заставляет меня полностью подняться на стену. Есть идеи о том, что мне не хватает?