title: How to retrieve JNDI using Spring @Configuration instead of XML configuration
body: <p>I've started development of a new Spring 3.2.4 application and am trying to use Java based configuration instead of XML files as I have used in the past.  However, I am having trouble making the transition.</p>
  
  <p>Using XML, I would code it as follows:</p>
  
  <pre><code>&lt;!-- application datasource --&gt;
  &lt;bean id="dataSource.jndi" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton" lazy-init="true"&gt;
      &lt;property name="jndiName" value="java:comp/env/jdbc/liment" /&gt;
  &lt;/bean&gt;
  
  &lt;bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"&gt;
      &lt;property name="entityManagerFactory" ref="entityManagerFactory"/&gt;
  &lt;/bean&gt;
  
  &lt;tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/&gt;
  &lt;bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"&gt;
      &lt;property name="persistenceUnitName" value="persistenceUnit"/&gt;
      &lt;property name="dataSource" ref="dataSource.jndi"/&gt;
  &lt;/bean&gt;
  </code></pre>
  
  <p>However, I am very much stuck trying to figure out how to do this in Java.  I'm trying to replicate the configuration, but running into trouble:</p>
  
  <pre><code>@Configuration
  @EnableTransactionManagement
  @EnableJpaRepositories(basePackages={"com.ia"})
  public class AppConfigJPA {
      @Bean
      public DataSource dataSource() {
          // configure and return the necessary JDBC DataSource
          JndiObjectFactoryBean dataSource = new JndiObjectFactoryBean();
          dataSource.setJndiName("java:comp/env/jdbc/liment");
          try {
              dataSource.afterPropertiesSet();
          } catch (IllegalArgumentException | NamingException e) {
              // rethrow
              throw new RuntimeException(e);
          }
          return (DataSource)dataSource.getObject();
      }
  
      @Bean
      public EntityManagerFactory entityManagerFactory(){
          LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
          emf.setPersistenceUnitName("persistenceUnit");
          emf.setDataSource(dataSource());
              emf.afterPropertiesSet
          return emf.getObject();
      }
  
      @Bean
      public PlatformTransactionManager transactionManager() {
          return new JpaTransactionManager(entityManagerFactory());
      }
  
  }
  </code></pre>
  
  <p>However, I get the following error message:</p>
  
  <pre><code>Caused by: java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation.
      at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:142)
      at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.setBeanFactory(PersistenceExceptionTranslationInterceptor.java:117)
      at org.springframework.data.repository.core.support.PersistenceExceptionTranslationRepositoryProxyPostProcessor.&lt;init&gt;(PersistenceExceptionTranslationRepositoryProxyPostProcessor.java:44)
      at org.springframework.data.repository.core.support.TransactionalRepositoryFactoryBeanSupport.setBeanFactory(TransactionalRepositoryFactoryBeanSupport.java:85)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1502)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1470)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
      ... 33 more
  </code></pre>
  
  <p>What am I missing or doing wrong?</p>
  
  <p><em><strong>EDIT</em></strong></p>
  
  <p>Following @SotiriosDelimanolis response, I have modified my code to read the following:</p>
  
  <pre><code>@Autowired DataSource dataSource;
  @Autowired EntityManagerFactory entityManagerFactory;
  
  
  @Bean
  public JndiObjectFactoryBean dataSource() {
      // configure and return the necessary JDBC DataSource
      JndiObjectFactoryBean dataSource = new JndiObjectFactoryBean();
      dataSource.setJndiName("java:comp/env/jdbc/josak");
      return dataSource;
  }
  
  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
      LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
      emf.setPersistenceUnitName("persistenceUnit");
      emf.setDataSource(dataSource);
      return emf;
  }
  
  @Bean
  public PlatformTransactionManager transactionManager() {
      return new JpaTransactionManager(entityManagerFactory);
  }
  </code></pre>
  
  <p>But am getting Autowired exceptions instead now:</p>
  
  <pre><code>Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: javax.sql.DataSource com.ia.system.configuration.AppConfigJPA.dataSource; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
      at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
      ... 31 more
  Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:988)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:858)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770)
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
      ... 33 more
  </code></pre>