title: Spring Boot Using Embedded Tomcat with JNDI
body: <p>I am using Spring Boot with Embedded Tomcat and attempting to use JNDI but getting the following error: </p>
  
  <p>javax.naming.NameNotFoundException: Name [jdbc/dataSource]</p>
  
  <p>Any tips would be greatly appreciated. </p>
  
  <p>Here is my code: </p>
  
  <pre><code>@Configuration
  public class TomcatJndiConfiguration{
  
  @Value("${database.driver}")
  private String driverClassName;
  
  @Value("${database.url}")
  private String databaseUrl;
  
  @Value("${database.username}")
  private String databaseUsername;
  
  @Value("${database.password}")
  private String databasePassword;
  
  @Bean
  public TomcatEmbeddedServletContainerFactory tomcatFactory() {
      return new TomcatEmbeddedServletContainerFactory() {
  
          @Override
          protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                  Tomcat tomcat) {
              tomcat.enableNaming();
              return super.getTomcatEmbeddedServletContainer(tomcat);
          }
  
          @Override
          protected void postProcessContext(Context context) {
              ContextResource resource = new ContextResource();
              resource.setName("jdbc/dataSource");
              resource.setType(DataSource.class.getName());
              resource.setProperty("driverClassName", driverClassName);
              resource.setProperty("url", databaseUrl);
              resource.setProperty("password", databaseUsername);
              resource.setProperty("username", databasePassword);
              context.getNamingResources().addResource(resource);
          }
      };
  }
  
  @Bean
  public DataSource dataSource() throws IllegalArgumentException, NamingException {
      JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
      bean.setJndiName("jdbc/dataSource");
      bean.setLookupOnStartup(true);
      bean.setProxyInterface(DataSource.class);
      bean.setResourceRef(true);
      bean.afterPropertiesSet();
      return (DataSource) bean.getObject();
  
  }
  Stacktrace is: 
  Caused by: javax.naming.NameNotFoundException: Name [jdbc/dataSource] is not bound in this Context. Unable to find [jdbc].
  at org.apache.naming.NamingContext.lookup(NamingContext.java:818)
  at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
  at org.apache.naming.SelectorContext.lookup(SelectorContext.java:157)
  at javax.naming.InitialContext.lookup(InitialContext.java:417)
  at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
  at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
  at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
  at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179)
  at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
  at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:106)
  at org.springframework.jndi.JndiObjectTargetSource.afterPropertiesSet(JndiObjectTargetSource.java:97)
  at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.createJndiObjectProxy(JndiObjectFactoryBean.java:318)
  at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.access$000(JndiObjectFactoryBean.java:307)
  at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:200)
  at com.kronos.daas.configuration.TomcatJndiConfiguration.dataSource(TomcatJndiConfiguration.java:72)
  </code></pre>