Reputation: 283
package baseDao;
public interface BaseDao {
public void create(Object obj);
public void delete(Object obj);
public void update(Object obj);
public void get(Object obj);
}
package baseDao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
public abstract class BaseDaoImpl implements BaseDao {
@Autowired
private SessionFactory usermanagementSessionFactory;
private Session session = usermanagementSessionFactory.getCurrentSession();
/*-----------------To save an object--------------*/
public void create(Object obj){
session.save(obj);
}
/*-----------------To delete an object--------------*/
public void delete(Object obj){
session.delete(obj);
}
/*-----------------To update an object--------------*/
public void update(Object obj){
session.update(obj);
}
/*-----------------To find/Get an object--------------*/
public void get(Object obj){
}
protected SessionFactory getUsermanagementSessionFactory() {
return usermanagementSessionFactory;
}
protected void setUsermanagementSessionFactory(
SessionFactory usermanagementSessionFactory) {
this.usermanagementSessionFactory = usermanagementSessionFactory;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<util:properties id="usermanagementHibernateProperties" location="classpath:usermanagement-hibernate.properties" />
<bean id="usermanagementSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="usermanagementDataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.usermanagement.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="hibernateProperties" ref="usermanagementHibernateProperties" />
</bean>
<jee:jndi-lookup id="usermanagementDataSource" jndi-name="java:usermanagementDS" />
<bean id="city" class="com.ecom.data.entities.user.City"/>
<bean id="state" class="com.ecom.data.entities.user.State"/>
<bean id="country" class="com.ecom.data.entities.user.Country"/>
<bean id="pincodes" class="com.ecom.data.entities.user.Pincodes"/>
<bean id="notification" class="com.ecom.data.entities.notification.Notifications"/>
<bean id="notification_types" class="com.ecom.data.entities.notification.Notification_Types"/>
<bean id="transactions" class="com.ecom.data.entities.transaction.Transactions"/>
<bean id="address" class="com.ecom.data.entities.user.Address"/>
<bean id="user_master" class="com.ecom.data.entities.user.User_Master"/>
<bean id="notification_channels" class="com.ecom.data.entities.notification.Notification_Channels"/>
<bean id="notification_time" class="com.ecom.data.entities.notification.Notification_Time"/>
<bean id="prefilled_response" class="com.ecom.data.entities.product.Prefilled_Response"/>
<bean id="payment_options" class="com.ecom.data.entities.transaction.Payment_Options"/>
<bean id="catagory" class="com.ecom.data.entities.product.Catagory"/>
<bean id="vendor" class="com.ecom.data.entities.product.Vendor"/>
<bean id="requester" class="com.ecom.data.entities.product.Requester"/>
<bean id="requirement_type" class="com.ecom.data.entities.product.Requirement_type"/>
<bean id="discount_offer_type" class="com.ecom.data.entities.product.Discount_Offer_Type"/>
<bean id="discount_offers" class="com.ecom.data.entities.product.Discount_Offers"/>
<bean id="requirements" class="com.ecom.data.entities.product.Requirements"/>
<bean id="product_catalog" class="com.ecom.data.entities.product.Product_Catalog"/>
<bean id="product_catalog_vendor" class="com.ecom.data.entities.product.Product_Catalog_Vendor"/>
<bean id="product_vendor_payment_option_location" class="com.ecom.data.entities.product.PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION"/>
<bean id="baseDaoImpl" abstract="true" class="baseDao.BaseDaoImpl"> </bean>
<bean id="pincodeDao" parent="baseDaoImpl" class="com.ecom.data.access.user.PincodeDao"> </bean>
</beans>
package com.ecom.data.access.user;
import junit.framework.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.ecom.data.entities.user.Pincodes;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/applicationContext-usermanagement-dao.xml",
"/applicationContext-usermanagement-dao-test.xml" })
public class PiccodeTest extends AbstractTransactionalJUnit4SpringContextTests {
@BeforeClass
public static void setup(){}
@Test
public void pincodeTest(){
PincodeDao pinDao = new PincodeDao(); // object of dao class to call the create method
pinDao.save();
}
}
______________________________________________________________________
when i run this code with junit with maven it gives the error
-------------------->
SEVERE: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@1f2edd2] to prepare test instance [com.ecom.data.access.user.PiccodeTest@1dbb27d]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pincodeDao' defined in class path resource [applicationContext-usermanagement-dao.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ecom.data.access.user.PincodeDao]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1011)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:957)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:44)
at org.springframework.test.context.TestContext.buildApplicationContext(TestContext.java:198)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:233)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:126)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ecom.data.access.user.PincodeDao]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1004)
... 30 more
Caused by: java.lang.NullPointerException
at baseDao.BaseDaoImpl.<init>(BaseDaoImpl.java:11)
at com.ecom.data.access.user.PincodeDao.<init>(PincodeDao.java:7)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
... 32 more
in this code i am trying tu run my entity i have a pincode entity with getter setter and all things now i just want to save the data with this code in my test scope
i am using hibernate 4 spring 3 and maven 3
Upvotes: 15
Views: 71832
Reputation: 1859
I know this is an old post, but I'm going to attempt to answer. The issue here is in the use of SessionFactory
. When the code is initially started, Spring instantiates the beans and makes them available dependent on your application's configuration. The bean for SessionFactory
is instantiated at that time, but it doesn't contain any Sessions.
This is because there are no active sessions until a user logs in to the system. The SessionFactory
won't actually contain a session until after a user logs in. So, you are attempting to call getCurrentSession()
on an object that doesn't have a current session.
Your best and simplest option to get past this would be to call getCurrentSession()
at run time. That would mean making the method call within your create
and delete
methods. Something similar to this
public void create(Object obj){
usermanagementSessionFactory.getCurrentSession().save(obj);
}
Upvotes: 0
Reputation: 371
You are trying to initialize session object, when usernameSessionFactory object is not initialized yet.
In a class, all Spring @Autowired objects are initialized just after the construction of the instance of such class is done.
private Session session = usermanagementSessionFactory.getCurrentSession();
But if an instance decleared in a way like the above code, will be initialized earlier than construction, in a way that they can even be used as parameters of construction.
@Autowired
private SessionFactory usermanagementSessionFactory;
private Session session;
@PostConstruct
public void init() {
session = usermanagementSessionFactory.getCurrentSession();
}
Above code, will initialize session object after the construction, which means usermanagementSessionFactory is ready and not null.
Hopefull it helps..
Upvotes: 3
Reputation: 10034
Move the session initialization to below method
@PostConstruct
public void init(){
session = usermanagementSessionFactory.getCurrentSession();
}
Upvotes: 19
Reputation: 19225
The problem is here:
@Autowired
private SessionFactory usermanagementSessionFactory;
private Session session = usermanagementSessionFactory.getCurrentSession();
The sessionFactory needs to be autowired, but this only happens after construction. Construction involves the second line being executed - which uses the unset factory. Hence you get a null pointer exception.
Even though your class doesnt have a constructor, construction of an instance can still thow an exception as a result of field initialisation, as in this case.
Upvotes: 8