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.

Followers

Pageviews Last 7 Days