Spring data JPA Repository @autowired gives null

autowired, spring, spring-data, spring-data-jpa

Solution

I believe the issue is this line:

new ServerApp().sampleMethod();

When you invoke from a main you can still rely on autowiring, but you need to use the `ApplicationContext` to retrieve the bean.

Like this:

ServerApp app = context.getBean("ServerApp");  

Note It is important to note this function is overloaded, so you may have better luck with the overload

When you use the `new` keyword you are bypassing Spring and utilizing pure Java instantiation.

Problem

I've been trying out `spring-data-jpa`. With the help of Reference Documentation and my prior spring knowledge, I've set up spring-data-jpa configuration but the `Repository` that I `@Autowired` is always returned null. I've refer to other questions over here but I haven't figure out the solution. My ApplicationContext configuration is ``` @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(); } } ``` My Entity definition is as follows ``` @Entity public class Item implements Serializable { 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()); } } ``` ` My Repository definition is as follows ``` @Repository public interface ItemRepository extends JpaRepository { } ``` ` While I try to run a sample application as follows ``` public class ServerApp { @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"); } } ``` ` I get the following output in console. ``` SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder 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) ``` ` As it can be seen in output, there is `NullPointerException` and thus the `ItemRepository` is not `Autowired`. I've written a Test for the Repository as follows. ``` @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = JpaContext.class) @Transactional public class ItemRepositoryTest { @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())); } } ``` ` What is missing in my configuration? How can I solve this problem? Thanks

Original source