title: Spring data JPA Repository @autowired gives null
body: <p>I've been trying out <code>spring-data-jpa</code>. With the help of <a href="http://static.springsource.org/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/" rel="nofollow">Reference Documentation</a> and my prior spring knowledge, I've set up spring-data-jpa configuration but the <code>Repository</code> that I <code>@Autowired</code> is always returned null. I've refer to other questions over here but I haven't figure out the solution.</p>
  
  <p>My <strong>ApplicationContext</strong> configuration is</p>
  
  <pre><code>
  @Configuration
  @EnableJpaRepositories("devopsdistilled.operp.server.data")
  @EnableTransactionManagement
  @PropertySource("server/jdbc.properties")
  @ComponentScan("devopsdistilled.operp.server.data")
  public class JpaContext {
  
      @Inject
      private Environment env;
  
      @Value("devopsdistilled.operp.server.data.entity")
      private String packagesToScan;
  
      @Bean
      public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {
          return new PropertySourcesPlaceholderConfigurer();
      }
  
      @Bean
      public DataSource dataSource() {
          BasicDataSource dataSource = new BasicDataSource();
          dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
          dataSource.setUrl(env.getProperty("jdbc.url"));
          dataSource.setUsername(env.getProperty("jdbc.username"));
          dataSource.setPassword(env.getProperty("jdbc.password"));
          dataSource.setInitialSize(2);
          dataSource.setMaxActive(10);
          return dataSource;
      }
  
      @Bean
      public JpaVendorAdapter jpaVendorAdapter() {
          HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
          jpaVendorAdapter.setDatabase(Database.MYSQL);
          jpaVendorAdapter.setGenerateDdl(true);
          jpaVendorAdapter.setShowSql(true);
          jpaVendorAdapter
                  .setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
          return jpaVendorAdapter;
      }
  
      @Bean
      public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
          LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
          emf.setDataSource(this.dataSource());
          emf.setJpaVendorAdapter(this.jpaVendorAdapter());
          emf.setPackagesToScan(packagesToScan);
          emf.setJpaProperties(this.hibernateProperties());
          return emf;
      }
  
      @Bean
      public JpaDialect jpaDialect() {
          return new HibernateJpaDialect();
      }
  
      @Bean
      public JpaTransactionManager transactionManager() {
          JpaTransactionManager transactionManager = new JpaTransactionManager();
          transactionManager.setEntityManagerFactory(entityManagerFactory()
                  .getObject());
          transactionManager.setJpaDialect(jpaDialect());
          return transactionManager;
      }
  
      @Bean
      public Properties hibernateProperties() {
          Properties hibernateProps = new Properties();
          hibernateProps.setProperty("hibernate.hbm2ddl.auto", "create");
          return hibernateProps;
      }
  
      @Bean
      public PersistenceExceptionTranslationPostProcessor exceptionTranslationPostProcessor() {
          return new PersistenceExceptionTranslationPostProcessor();
      }
  }
  
  </code></pre>
  
  <p>My <strong>Entity</strong> definition is as follows</p>
  
  <p><pre><code>
  @Entity
  public class Item implements Serializable {</p>
  
  <pre><code>private static final long serialVersionUID = 7751126479626962944L;
  private Long id;
  private String name;
  
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long getId() {
      return id;
  }
  
  public void setId(Long id) {
      this.id = id;
  }
  
  public String getName() {
      return name;
  }
  
  public void setName(String name) {
      this.name = name;
  }
  
  @Override
  public String toString() {
      return new String("Id: " + getId() + "\nName: " + getName());
  }
  </code></pre>
  
  <p>}
  </pre></code></p>
  
  <p>My <strong>Repository</strong> definition is as follows</p>
  
  <p><pre><code>
  @Repository
  public interface ItemRepository extends JpaRepository {
  }
  </pre></code></p>
  
  <p>While I try to run a sample application as follows
  <pre><code></p>
  
  <p>public class ServerApp {</p>
  
  <pre><code>@Inject
  ItemRepository itemRepository;
  
  public static void main(String[] args) {
      ApplicationContext context = new AnnotationConfigApplicationContext(
              JpaContext.class);
      new ServerApp().sampleMethod();
      System.out.println(context);
  }
  
  public void sampleMethod() {
      Item item = new Item();
      item.setName("Test Item");
      item = itemRepository.save(item);
      System.out.println(itemRepository.findOne(item.getId()));
      System.out.println("From sampleMethod");
  }
  </code></pre>
  
  <p>}
  </pre></code></p>
  
  <p>I get the following output in console.
  <pre><code>
  SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
  SLF4J: Defaulting to no-operation (NOP) logger implementation
  SLF4J: See <a href="http://www.slf4j.org/codes.html#StaticLoggerBinder" rel="nofollow">http://www.slf4j.org/codes.html#StaticLoggerBinder</a> for further details.
  Apr 29, 2013 5:31:24 PM org.hibernate.annotations.common.Version 
  INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
  Apr 29, 2013 5:31:24 PM org.hibernate.Version logVersion
  INFO: HHH000412: Hibernate Core {4.1.9.Final}
  Apr 29, 2013 5:31:24 PM org.hibernate.cfg.Environment 
  INFO: HHH000206: hibernate.properties not found
  Apr 29, 2013 5:31:24 PM org.hibernate.cfg.Environment buildBytecodeProvider
  INFO: HHH000021: Bytecode provider name : javassist
  Apr 29, 2013 5:31:24 PM org.hibernate.ejb.Ejb3Configuration configure
  INFO: HHH000204: Processing PersistenceUnitInfo [
      name: default
      ...]
  Apr 29, 2013 5:31:24 PM org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator instantiateExplicitConnectionProvider
  INFO: HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
  Apr 29, 2013 5:31:25 PM org.hibernate.dialect.Dialect 
  INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
  Apr 29, 2013 5:31:25 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
  INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
  Apr 29, 2013 5:31:25 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory 
  INFO: HHH000397: Using ASTQueryTranslatorFactory
  Apr 29, 2013 5:31:25 PM org.hibernate.validator.internal.util.Version 
  INFO: HV000001: Hibernate Validator 4.3.1.Final
  Apr 29, 2013 5:31:25 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
  INFO: HHH000227: Running hbm2ddl schema export
  Hibernate: drop table if exists Item
  Hibernate: create table Item (id bigint not null auto_increment, name varchar(255), primary key (id))
  Apr 29, 2013 5:31:25 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
  INFO: HHH000230: Schema export complete
  Exception in thread "main" java.lang.NullPointerException
      at devopsdistilled.operp.server.ServerApp.sampleMethod(ServerApp.java:27)
      at devopsdistilled.operp.server.ServerApp.main(ServerApp.java:20)
  </pre></code></p>
  
  <p>As it can be seen in output, there is <code>NullPointerException</code> and thus the <code>ItemRepository</code> is not <code>Autowired</code>.</p>
  
  <p>I've written a <strong>Test</strong> for the Repository as follows.</p>
  
  <p><pre><code>
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration(classes = JpaContext.class)
  @Transactional
  public class ItemRepositoryTest {</p>
  
  <pre><code>@Inject
  private ItemRepository itemRepository;
  private Item item;
  
  @Before
  public void setUp() throws Exception {
      item = new Item();
      item.setName("Test Item");
  }
  
  @Test
  public void testSave() {
      item = itemRepository.save(item);
      Assert.assertEquals(item, itemRepository.findOne(item.getId()));
  }
  </code></pre>
  
  <p>}</p>
  
  <p></pre></code></p>
  
  <p><strong>What is missing in my configuration?</strong></p>
  
  <p><strong>How can I solve this problem?</strong></p>
  
  <p>Thanks</p>