代码之家  ›  专栏  ›  技术社区  ›  Bibek Shakya Dev. Joel

@自动连线SessionFactory在Java配置中返回空spring

  •  1
  • Bibek Shakya Dev. Joel  · 技术社区  · 9 年前

    当我尝试在sessionFactory中使用DI时,我在sessionFactory中出现了空指针异常。我必须将Spring3项目转换为Spring4,而不使用xml。我不知道我面临的问题是什么,SessionFactory根本没有自动连接。当我尝试测试用例通用doa添加方法时

    下面是我的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;
    }
    }
    

    为了加载这个类,我创建了

    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("/");
    }
    
    }
    

    这是我的泛型doa类,当SessionFactory试图访问它时,我在其中注入它 sessionFactory.getCurrentSession(); 发生NPE,

    @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();
    }  
    }
    

    这是我对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)
    

    这是我的用户实体

    @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
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Tahir Hussain Mir    9 年前

    在聊天中,您向我提供了以下代码:

     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("dsadas@gmail.com");
         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);
       }
    

    错误原因:
    HibernateDAO 像这样的例子
    IGenericDao<User> iGenericDao = new HibernateDAO<>();
    这造成了问题。

    在使用注释的情况下,手动创建新实例通常会导致上述错误。
    错误原因:
    Spring只能自动连接它管理的bean;如果您自己调用new来创建bean,@Autowired字段不会被填充(也不会调用@PostConstruct等方法)。

    解决方案:
    您需要添加 @autowired 到 冬眠岛 它将用包含实数的精确类实例化它 @Autowired 会话工厂。

    实例 :
    通常我们在类中这样做,类本身用注释进行注释,如 @Controller 或 @Service .
    这样地

    @Controller
    @RequestMapping(value="/someURL")
    public class mainClass {
        @Autowired
        HibernateDAO abc;
        //Code (methods) to test Your CRUD Operations
    }