UNIXwork

JNDI mit Glassfish und Tomcat

2. November 2014

Möchte man, dass eine Java-Webanwendungen auf verschiedenen Applicationservern oder Servletcontainern lauffähig ist, gibt es im Bezug auf JNDI einen kleinen Fallstrick. Die JNDI-Namen für Resourcen sind nämlich nicht überall gleich. Mit folgendem Code kann man unter Glassfish auf einen vom Applicationserver zur Verfügung gestellten Connection-Pool zugreifen:

InitialContext context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("jdbc/mydb");
Connection connection = dataSource.getConnection();

Mit anderen Servern, wie z.B. Apache Tomcat, funktioniert dies jedoch nicht. Statt dem String "jdbc/mydb" müsste man dort "java:comp/env/jdbc/mydb" verwenden. Das wiederum funktioniert nicht mit Glassfish, zumindestens nicht ohne weiteres. Allerdings gibt es dafür eine Lösung.

Man verwendet folgenden Java-Code.

DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/mydb");

Dazu muss man dann noch den Standard Deployment Descriptor web.xml und die glassfish-web.xml anpassen. In die web.xml wird folgendes eingefügt:

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

und in die glassfish-web.xml das:

<resource-ref>
    <res-ref-name>jdbc/mydb</res-ref-name>
    <jndi-name>jdbc/mydb</jndi-name>  
</resource-ref>

Danach funktioniert die Webapp sowohl mit Glassfish als auch mit Tomcat, wenn im Server die nötigen JNDI-Resourcen konfiguriert sind.

Autor: Olaf | 1 Kommentare | Tags: java, glassfish, tomcat

Kommentare

UniversE
03.11.2014 10:49

Hilfreicher Artikel - aber es geht glaube ich besser. Du könntest dir mal die @Ressource-Annotation genauer anschauen, da gibt es ein mappedName-Attribut. Es müsste also alles komplett ohne web.xml gehen - vielleicht.


Name
Webseite (optional)
Captcha: 3x=12   x=?
Kommentar