Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Glassfish: Unable to map datasource JNDI name to portable name using glassfish-web.xml

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):

  • Use internal name in persistence.xml, eg "my-datasource"
  • Add a resource-ref entry to web.xml declaring that your app needs a resource called "my-datasource"
  • Add a mapping in glassfish-web.xml and jboss-web.xml with the appropriate server's syntax, declaring that "my-datasource" should be mapped to the app server provided data source named "real-DS-created-by-admin"

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?

like image 588
Craig Ringer Avatar asked Jul 12 '11 06:07

Craig Ringer


1 Answers

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.

like image 183
Craig Ringer Avatar answered Nov 10 '22 16:11

Craig Ringer