I'm going slightly insane trying to make a Java EE 6 webapp portable between Glassfish AS 3.x and JBoss AS 6 (and 7 when released).
Because each server maps JNDI names for datasources differently, I need to specify an application-private internal name for the datasource in persistence.xml then use glassfish-web.xml or jboss-web.xml (as appropriate) to map that to a real datasource name in the server.
The theory is simple (well, for EE):
Unfortunately, the theory is about as far as it goes, because for the life of me I cannot make it work in Glassfish AS 3.1, 3.1.1, 3.2 beta, JBoss AS 6, or JBoss AS 7 beta. Right now I'm focusing on getting it working on Glassfish.
Glassfish reports "Invalid resource : my-datasource__pm" when I try to deploy an app that references "my-datasource" in 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>
and maps it to a known existing datasource via 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>
... and 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" shows the actual datasource JNDI name exactly as it appears in glassfish-web.xml as well as listing another entry with a "__pm" suffix that's generated by Glassfish:
$ asadmin list-jndi-entries
.... unrelated output ....
realdsname__pm: javax.naming.Reference
realdsname: javax.naming.Reference
Needless to say, this is driving me completely up the wall. Any ideas on what I'm missing?
OK, here's the situation.
It's not supposed to work (see http://java.net/jira/browse/GLASSFISH-17024) and apparently that's OK.
Apparently everybody defines their data sources in annotations, in web.xml <data-source/> clauses, or just targets only one app server. All the mapping stuff is completely non-functional for JPA even though it works fine for @Resource injection, JNDI lookups, Spring, etc.
I've added this to my already-way-too-long java EE 6 warts and traps page.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With