/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.jndi;
import javax.naming.NamingException;
import org.springframework.core.env.PropertySource;
import org.springframework.lang.Nullable;
PropertySource
implementation that reads properties from an underlying Spring JndiLocatorDelegate
. By default, the underlying JndiLocatorDelegate
will be configured with its "resourceRef"
property set to true
, meaning that names looked up will automatically be prefixed with "java:comp/env/" in alignment with published JNDI
naming conventions. To override this setting or to change the prefix, manually configure a JndiLocatorDelegate
and provide it to one of the constructors here that accepts it. The same applies when providing custom JNDI properties. These should be specified using JndiAccessor.setJndiEnvironment(Properties)
prior to construction of the JndiPropertySource
.
Note that
StandardServletEnvironment
includes a JndiPropertySource
by default, and any customization of the underlying JndiLocatorDelegate
may be performed within an
ApplicationContextInitializer
or
WebApplicationInitializer
.
Author: Chris Beams, Juergen Hoeller See Also: - JndiLocatorDelegate
- ApplicationContextInitializer
- WebApplicationInitializer
- StandardServletEnvironment
Since: 3.1
/**
* {@link PropertySource} implementation that reads properties from an underlying Spring
* {@link JndiLocatorDelegate}.
*
* <p>By default, the underlying {@code JndiLocatorDelegate} will be configured with its
* {@link JndiLocatorDelegate#setResourceRef(boolean) "resourceRef"} property set to
* {@code true}, meaning that names looked up will automatically be prefixed with
* "java:comp/env/" in alignment with published
* <a href="http://download.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html">JNDI
* naming conventions</a>. To override this setting or to change the prefix, manually
* configure a {@code JndiLocatorDelegate} and provide it to one of the constructors here
* that accepts it. The same applies when providing custom JNDI properties. These should
* be specified using {@link JndiLocatorDelegate#setJndiEnvironment(java.util.Properties)}
* prior to construction of the {@code JndiPropertySource}.
*
* <p>Note that {@link org.springframework.web.context.support.StandardServletEnvironment
* StandardServletEnvironment} includes a {@code JndiPropertySource} by default, and any
* customization of the underlying {@link JndiLocatorDelegate} may be performed within an
* {@link org.springframework.context.ApplicationContextInitializer
* ApplicationContextInitializer} or {@link org.springframework.web.WebApplicationInitializer
* WebApplicationInitializer}.
*
* @author Chris Beams
* @author Juergen Hoeller
* @since 3.1
* @see JndiLocatorDelegate
* @see org.springframework.context.ApplicationContextInitializer
* @see org.springframework.web.WebApplicationInitializer
* @see org.springframework.web.context.support.StandardServletEnvironment
*/
public class JndiPropertySource extends PropertySource<JndiLocatorDelegate> {
Create a new JndiPropertySource
with the given name and a JndiLocatorDelegate
configured to prefix any names with "java:comp/env/". /**
* Create a new {@code JndiPropertySource} with the given name
* and a {@link JndiLocatorDelegate} configured to prefix any names with
* "java:comp/env/".
*/
public JndiPropertySource(String name) {
this(name, JndiLocatorDelegate.createDefaultResourceRefLocator());
}
Create a new JndiPropertySource
with the given name and the given JndiLocatorDelegate
. /**
* Create a new {@code JndiPropertySource} with the given name and the given
* {@code JndiLocatorDelegate}.
*/
public JndiPropertySource(String name, JndiLocatorDelegate jndiLocator) {
super(name, jndiLocator);
}
This implementation looks up and returns the value associated with the given name from the underlying JndiLocatorDelegate
. If a NamingException
is thrown during the call to JndiLocatorDelegate.lookup(String)
, returns null
and issues a DEBUG-level log statement with the exception message. /**
* This implementation looks up and returns the value associated with the given
* name from the underlying {@link JndiLocatorDelegate}. If a {@link NamingException}
* is thrown during the call to {@link JndiLocatorDelegate#lookup(String)}, returns
* {@code null} and issues a DEBUG-level log statement with the exception message.
*/
@Override
@Nullable
public Object getProperty(String name) {
if (getSource().isResourceRef() && name.indexOf(':') != -1) {
// We're in resource-ref (prefixing with "java:comp/env") mode. Let's not bother
// with property names with a colon it since they're probably just containing a
// default value clause, very unlikely to match including the colon part even in
// a textual property source, and effectively never meant to match that way in
// JNDI where a colon indicates a separator between JNDI scheme and actual name.
return null;
}
try {
Object value = this.source.lookup(name);
if (logger.isDebugEnabled()) {
logger.debug("JNDI lookup for name [" + name + "] returned: [" + value + "]");
}
return value;
}
catch (NamingException ex) {
if (logger.isDebugEnabled()) {
logger.debug("JNDI lookup for name [" + name + "] threw NamingException " +
"with message: " + ex.getMessage() + ". Returning null.");
}
return null;
}
}
}