11/05/2010

Programmatically bind global JNDI resources

Starting from Java EE 6, an application can configure JNDI resources in global, application, module, and component namespaces. Usually this is done with @Resource annotations and deployment descriptors. It is also possible to bind global JNDI resources programmatically in a Java EE application, as shown in the following servlet.

package test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import javax.naming.*;
import javax.annotation.*;

@WebServlet(urlPatterns = "/*")
public class TestServlet extends HttpServlet {

private static final String name = "java:global/env/foo";
private static final String value = "FOO";

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();

try {
InitialContext ic = new InitialContext();
try {
Object obj = ic.lookup(name);
out.println("found " + name + " : " + obj);
} catch (NamingException ne) {
ic.rebind(name, value);
out.println("not found: " + name + ", rebind: " + value);
}
} catch (NamingException e) {
out.println(e);
}
}

@PreDestroy
private void preDestroy() {
try {
InitialContext ic = new InitialContext();
ic.unbind(name);
System.out.println("unbound " + name);
} catch (NamingException e) {
System.out.println("failed to unbind " + name);
}
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Compile TestServlet.java, package it in test.war:WEB-INF/classes/test/TestServlet.class, cp it to $GLASSFISH_HOME/domains/domain1/autodeploy/, and run it at http://localhost:8080/test/

Result from the first run:
not found: java:global/env/foo, rebind: FOO
Result from the subsequent run:
found java:global/env/foo : FOO
You can also verify the global JNDI resource with GlassFish asadmin command:
$ asadmin list-jndi-entries --context java:global/env
foo: java.lang.String
This resource is available server-wide to all deployed apps. It will be removed after test.war is undeployed thanks to TestServlet.preDestroy. To retain it beyond the life of test.war, do not unbind it in TestServlet.preDestroy.

7 comments:

Anonymous said...

Hi there, is it possible somehow to bind JNDI resources programmatically on a Java EE 5 server?

Thanks: Csaba

javahowto said...

Yes, the same approach should also work in Java EE 5. What's new in EE 6 is that it standardized the 3 namespaces: java:global, java:app & java:module.

Anonymous said...

I understand that the resource won't be unbound when undeploying the app, if you don't unbind it @PreDestroy. But are programmatically bind JNDI resources survive a server restart?
Thank you

javahowto said...

No, JNDI resources are typically transient, and won't survive server restart.

Kalpa Welivitigoda said...

Hi,

How can I programatically bind a JNDI to a specific context?

Steve Smith said...

Great and Useful Article.

Online Java Training

Java Online Training India

Java Online Course

Java EE course

Java EE training

Best Recommended books for Spring framework

Java Interview Questions








Java Course in Chennai

Java Online Training India

Vũ Diệu Linh said...

I enjoyed on reading your blog post. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. Please visit my website, Friv 4000 Games is where all the free friv games.
Friv 4000