0

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.

10
  • Autowired is missing, @Autowired private EntityManager entityManager; Commented Jun 12, 2020 at 4:40
  • Hi @sonus21 I think, Autowired & PersistenceContext are either or to be used right ? so PersistenceContext should also work, what is your opinion please ? Commented Jun 12, 2020 at 4:55
  • 1
    Autowired is sufficient as spring knows about entity manager. Frankly speaking, I have never used PersistenceContext, all I have used field injection and contractor injections and they worked very well. Commented Jun 12, 2020 at 4:57
  • Hi @sonus21, I tried your suggestion & replaced PersistenceContext with Autowired in 2 different repository classes & now i'm getting following exception : Error creating bean with name 'ProductRequestDaoImpl': Unsatisfied dependency expressed through field 'entityManager' : No qualifying bean of type 'javax.persistence.EntityManager' available,expected at least 1 bean which qualifies as autowire candidate Commented Jun 12, 2020 at 5:13
  • stackoverflow.com/questions/22301426/… Commented Jun 12, 2020 at 5:18

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.