I have seen many of the examples on StackOverflow talking about why entity manager could be null, i have been going through many of the tutorials as well but unable to figure out the issue in my case, here is the code : I'm using HSQLDB as datasource.
//This is how i'm trying to invoke the logic from another class
productReqService = ApplicationContextProvider.getApplicationContext().getBean(IProductRequestService.class);
//This is application context provider
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextProvider {
private static AnnotationConfigApplicationContext applicationContext;
static {
applicationContext = new AnnotationConfigApplicationContext(ProductConfiguration.class);
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
//This is Configuration
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import lombok.extern.slf4j.Slf4j;
@Configuration
@EnableTransactionManagement
@ComponentScans(value = { @ComponentScan("com.config") })
@Slf4j
public class ProductConfiguration {
private String hsqldbDriverClassName = "org.hsqldb.jdbc.JDBCDriver";
private UtilsVO utilsVO = ProductUtils.getUtilsVO();
private String hibernateHbmToDDL = "update";
private String hibernateDbDialect = "org.hibernate.dialect.HSQLDialect";
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
log.info("Execution In entityManagerFactory of ProductConfiguration");
log.info("Properties Read : {} ", utilsVO.getDbName());
LocalContainerEntityManagerFactoryBean entityManager = null;
JpaVendorAdapter jpaVendorAdapter = null;
try {
entityManager = new LocalContainerEntityManagerFactoryBean();
entityManager.setDataSource(dataSource());
entityManager.setPackagesToScan(new String[] { "com.config" });
jpaVendorAdapter = new HibernateJpaVendorAdapter();
entityManager.setJpaVendorAdapter(jpaVendorAdapter);
entityManager.setJpaProperties(additionalProperties());
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("Generic Exception occured while instantiating entityManager factory bean in entityManagerFactory() : {} ", e);
}
return entityManager;
}
@Bean
public DataSource dataSource() {
log.info("DBLocation in ProductConfiguration dataSource : {} ", utilsVO.getDbLocation());
DriverManagerDataSource dataSource = null;
try {
dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(hsqldbDriverClassName);
dataSource.setUrl("jdbc:hsqldb:hsql://" + utilsVO.getDbHost() + "/" + utilsVO.getDbName() + ";file:"
+ utilsVO.getDbLocation());
dataSource.setUsername(utilsVO.getUserName());
dataSource.setPassword(utilsVO.getUserPassword());
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("Generic Exception occured while instantiating dataSource bean in dataSource() : {} ", e);
}
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
log.info("Execution In transactionManager of ProductConfiguration");
JpaTransactionManager transactionManager = null;
try {
transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("Generic Exception occured while instantiating transactionManager bean in transactionManager() : {} ", e);
}
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
private Properties additionalProperties() {
log.info("Execution In additionalProperties of ProductConfiguration");
Properties properties = null;
try {
properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", hibernateHbmToDDL);
properties.setProperty("hibernate.dialect", hibernateDbDialect);
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("Generic Exception occured while setting additional Db dialect properties in additionalProperties() : {} ", e);
}
return properties;
}
//This is the Service Layer interface
public interface IProductRequestService {
public void writeProductRequests(ProductRequests productRequests);
public ProductRequests readProductRequests(ProductRequests productRequests);
public void updateProductRequests(ProductRequests productRequests);
}
//This is the Service
@Service
public class ProductRequestServiceImpl implements IProductRequestService {
@Autowired
private IProductRequestDao productRequestDao;
@Transactional
public void writeProductRequests(ProductRequests productRequestsObj) {
productRequestDao.writeProductRequests(productRequestsObj);
}
@Transactional(readOnly = true)
public ProductRequests readProductRequests(ProductRequests productRequestsObj) {
return productRequestDao.readProductRequests(productRequestsObj);
}
@Transactional
public void updateProductRequests(ProductRequests productRequestsObj) {
productRequestDao.updateProductRequests(productRequestsObj);
}
}
//This is repository layer interface
public interface IProductRequestDao {
public void writeProductRequests(ProductRequests productRequests);
public ProductRequests readProductRequests(ProductRequests productRequests);
public void updateProductRequests(ProductRequests productRequests);
}
//This is the repository layer
@Slf4j
@Repository
public class ProductRequestDaoImpl implements IProductRequestDao {
@PersistenceContext
private EntityManager entityManager;
@Override
public void writeProductRequests(ProductRequest pendReqObj) {
// TODO Auto-generated method stub
entityManager.persist(pendReqObj);//Null Pointer Exception
}
@Override
public ProductRequest readProductRequests(ProductRequest pendReqObj) {
// TODO Auto-generated method stub
//Read Operation
}
@Override
public void updateProductRequests(ProductRequest pendReqObj) {
// TODO Auto-generated method stub
log.info("Execution in updateProductRequests()");
entityManager.merge(pendReqObj);
}
}
Am i missing something, whatcould be wrong ? Thank You.
@Autowired private EntityManager entityManager;