Reputation: 1273
I m having null pointer exception in sessionFactory when i try to use DI in sessionFactory I have to turn spring 3 project into Spring 4 with no xml. I dont know what the problem i m facing, SessionFactory doesnot autowired at all. when i try to test case generic doa Add Method
here is my Configuration File for bean
@Configuration
@EnableTransactionManagement
@EnableWebMvc
@ComponentScan(basePackages = "io.github.bibekshakya35.ehealth")
public class EhealthCofiguration {
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean(name = "dataSource")
public javax.sql.DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://localhost:5432/ehealth");
dataSource.setUsername("test");
dataSource.setPassword("test123");
return dataSource;
}
@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(javax.sql.DataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.scanPackages("io.github.bibekshakya35.ehealth.model");
sessionBuilder.addProperties(getHibernateProperties());
return sessionBuilder.buildSessionFactory();
}
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
properties.put("hibernate.hbm2ddl.auto", "update");
return properties;
}
@Autowired
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(
SessionFactory sessionFactory) {
HibernateTransactionManager transactionManager = new HibernateTransactionManager(
sessionFactory);
return transactionManager;
}
}
to load this class i have created
public class EhealthWebAppIntializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(EhealthCofiguration.class);
ServletRegistration.Dynamic dispatcher =servletContext.addServlet("SpringDispatcher", new DispatcherServlet(applicationContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
this is my generic doa class where i m injecting SessionFactory when it try to access sessionFactory.getCurrentSession();
NPE is occur,
@Repository
@Transactional
public class HibernateDAO<T extends Serializable> implements IGenericDao<T> {
private Class<T> clazz;
Session session;
@Autowired
SessionFactory sessionFactory;
private static final Logger LOG = Logger.getLogger(HibernateDAO.class.getName());
@Override
public void setClazz(Class<T> clazzToSet) {
this.clazz = clazzToSet;
}
@Override
public void create(T entity) {
session = getCurrentSession();
LOG.log(Level.INFO, "inside create entity and you just bind your session to the current one{0}", session.toString());
session.saveOrUpdate(entity);
LOG.info("saved");
session.flush();
session.refresh(entity);
}
protected Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
}
Here is my stack trace for NPE
Exception in thread "main" java.lang.NullPointerException
at io.github.bibekshakya35.ehealth.DAO.genericdao.HibernateDAO.getCurrentSession(HibernateDAO.java:115)
at io.github.bibekshakya35.ehealth.DAO.genericdao.HibernateDAO.create(HibernateDAO.java:85)
at io.github.bibekshakya35.ehealth.service.impl.user.main(user.java:46)
here is my user entity
@Entity
@Table(name = "users")
public class User implements Serializable, AbstractEntity {
@Id
@Column(name = "username",unique = true)
private String userName;
@NotNull(message = "password cannot be empty")
@Column(name = "users_password")
private String userPassword;
@Embedded
private UserProfile userProfile;
@Embedded
private AuditInfo auditInfo;
@Enumerated(EnumType.STRING)
private UserType userType;
@Column(name = "is_active")
private boolean active = true;
//getter n setter
}
Upvotes: 1
Views: 3459
Reputation: 2626
In chat, You provided me with this code :
public static void main(String[] args) {
User user = new User();
IGenericDao<User> iGenericDao = new HibernateDAO<>();
user.setUserName("bibekshakya35");
user.setUserPassword("ros3");
user.setUserType(UserType.GUEST);
user.setActive(true);
UserProfile userProfile = new UserProfile();
userProfile.setAge(21);
userProfile.setBasicInfo("kdhsa");
userProfile.setEmailId("[email protected]");
userProfile.setUserGender(UserGender.Male);
userProfile.setFullname("bibek shakya");
userProfile.setMobileNumber("45454545");
userProfile.setLandLineNumber("445444");
userProfile.setUserProfilePic("index.jsp");
user.setUserProfile(userProfile);
AuditInfo auditInfo = new AuditInfo();
auditInfo.setCreatedOn(new Date());
auditInfo.setModifiedOn(new Date());
auditInfo.setVerifiedOn(new Date());
user.setAuditInfo(auditInfo);
iGenericDao.create(user);
}
Cause of error:
As You are creating the new HibernateDAO
instance like this IGenericDao<User> iGenericDao = new HibernateDAO<>();
This is creating the problem.
In the case where You are using annotations, creating new instance manually ,usually causes the above mentioned error.
Reason of error:
Spring can only autowire beans that it manages; if you call new to create a bean yourself, @Autowired fields don't get filled in (and methods like @PostConstruct aren't called).
Solution:
You need to add @autowired
to the HibernateDAO
which will instantiate it with the exact class which includes the real @Autowired
SessionFactory.
Example:
Usually we do it in the class which is itself annotated with annotations like @Controller
or @Service
.
Like this
@Controller
@RequestMapping(value="/someURL")
public class mainClass {
@Autowired
HibernateDAO abc;
//Code (methods) to test Your CRUD Operations
}
Upvotes: 2