DEV Community

Salad Lam
Salad Lam

Posted on

Quick look of JNDI (Java Naming and Directory Interface)

Simple to say, programmer can use the same JNDI interface to query the following

  • lookup resources provided by application server, such as data source
  • search LDAP entries
  • lookup DNS records

Brief introduction is here.

The code

Resources of the application server are placed under "java:comp/env" prefix. Assume that a data source is on

java:/comp/env/jdbc/db1
Enter fullscreen mode Exit fullscreen mode

To get that data source

javax.naming.Context initialContext = new javax.naming.InitialContext();
javax.naming.Context subContext = (javax.naming.Context) initialContext.lookup("java:comp/env");
DataSource dataSource = (DataSource) subContext.lookup("jdbc/db1");
Enter fullscreen mode Exit fullscreen mode

Or you may get the instance directly by providing the full path

javax.naming.Context initialContext = new javax.naming.InitialContext();
DataSource dataSource = (DataSource) initialContext.lookup("java:comp/env/jdbc/db1");
Enter fullscreen mode Exit fullscreen mode

Spring boot integration

Just add a line into application.properties

spring.datasource.jndi-name=java:/comp/env/jdbc/db1
Enter fullscreen mode Exit fullscreen mode

The related bean is created by org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration

@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore({ XADataSourceAutoConfiguration.class, DataSourceAutoConfiguration.class })
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnProperty(prefix = "spring.datasource", name = "jndi-name")
@EnableConfigurationProperties(DataSourceProperties.class)
public class JndiDataSourceAutoConfiguration {

    @Bean(destroyMethod = "")
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties, ApplicationContext context) {
        JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
        DataSource dataSource = dataSourceLookup.getDataSource(properties.getJndiName());
        excludeMBeanIfNecessary(dataSource, "dataSource", context);
        return dataSource;
    }

    private void excludeMBeanIfNecessary(Object candidate, String beanName, ApplicationContext context) {
        for (MBeanExporter mbeanExporter : context.getBeansOfType(MBeanExporter.class).values()) {
            if (JmxUtils.isMBean(candidate.getClass())) {
                mbeanExporter.addExcludedBean(beanName);
            }
        }
    }

}
Enter fullscreen mode Exit fullscreen mode

AWS Q Developer image

Your AI Code Assistant

Automate your code reviews. Catch bugs before your coworkers. Fix security issues in your code. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay