Albin Joseph
Albin Joseph

Reputation: 1050

Tomcat JNDI lookup problem

I was trying read a property value in Tomcat. My plan was to access the value using System.getProperty("LOGPATH") where LOGPATH is the name of my property. However I did not find a way to set a System property value in Tomcat.

Is there any way we can set a System property in Tomcat?

As I did not get any documentation on setting the System property I thought of accessing the value using JNDI. So I added the following entry

<Environment name="LOGPATH" type="java.lang.String" value="c:/temp" />

after

<GlobalNamingResources>

in server.xml file.

The code I used for looking up the JNDI is

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env/");

String path = (String) envCtx.lookup("LOGPATH");

When I executed the above code, I got the following error message.

javax.servlet.ServletException: Name LOGPATH is not bound in this Context
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)

Then I added an entry in my web.xml

 <resource-env-ref>
     <resource-env-ref-name>LOGPATH</resource-env-ref-name>
 <resource-env-ref-type>java.lang.String</resource-env-ref-type>
 </resource-env-ref>

Now the error message is changed to

javax.naming.NamingException: Cannot create resource instance
org.apache.naming.factory.ResourceEnvFactory.getObjectInstance(ResourceEnvFactory.java:99)

What am I doing wrong now? Thank you for the help.

Upvotes: 2

Views: 3489

Answers (3)

Devon_C_Miller
Devon_C_Miller

Reputation: 16518

You also need a resource link in your web app's context. The context is generally placed in META-INF/context.xml and will look something like this:

<Context>
    <Resource name="LOGPATH" global="LOGPATH" type="java.lang.String" />
</Context>

This "grants" the web app the rights to see the particular Environment value.

As for setting system properties, just add a line to tomcat/conf/catalina.properties like so:

LOGPATH=C:/temp

Just note that system properties are available to all web apps where as JNDI entries are controlled per web app.

Upvotes: 2

Thom
Thom

Reputation: 15042

I coded my environment string in a context file under conf/Catalina/localhost and named the same as my webapp. Then I used Spring's JndiObjectFactoryBean to retrieve it. Hope this is of some help.

Upvotes: 0

user207421
user207421

Reputation: 310860

Make it an init-param in your web.xml, and access it via the ServetContext.

Upvotes: 0

Related Questions