superDAO 中注入了hibernateTemplate,然后blogDAOImpl继承superDAO,使用hibernateTemplate时报空
请教各位高手!(我在supDAO中 setHibernateTempla中打印,出一句话,确定hibernateTemplate是注入了)
为什么这样的?????

解决方案 »

  1.   

    package com.registration.dao;import javax.annotation.Resource;import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.stereotype.Component;@Component
    public class SuperDao {

    HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() {
    // System.out.println("get:hibernateTemplate");
    return hibernateTemplate;
    }
        
    @Resource
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
    // System.out.println("set hibernateTemplate");
    this.hibernateTemplate = hibernateTemplate;
    }
    }
      

  2.   

    @Component("blogDAO")
    public class BlogDAOImpl extends SuperDAO implements BlogDAO { public BlogDAOImpl(){
    System.out.println("blogDAOimpl::::::");
    }

    @Override
    public void save(Blog blog) {
    // System.out.println("dao l ");
    // System.out.println("dao L d :"+blog.getBlogAbstract());

    // System.out.println("hT:"+hibernateTemplate);
      
    List<Blog> list=null;
    try {
    list = (List<Blog>) hibernateTemplate.find("from Blog");
    } catch (DataAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
            System.out.println(list.get(0));                 
     
    }
      

  3.   

     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
      </bean>
      <context:property-placeholder location="classpath:jdbc.properties"/>
      
      
      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
         <property name="packagesToScan">
          <list>
            <value>com.blog.model</value>
          </list>
        </property>
        
        <property name="hibernateProperties">
         <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>     
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>     </props>
        </property>
      </bean>
      <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
      </bean>
      
        
      
      <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
          <tx:method name="add*"/>
          <tx:method name="get*" read-only="true"/>
        </tx:attributes>
      </tx:advice>
      
      <aop:config>
        <aop:pointcut id="bussiness" expression="execution(public * com.registration..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="bussiness"/>
      </aop:config>  
      <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/>
      </bean>
      
      <bean id="bs" class="com.blog.service.ServiceManager"/>
      
      <bean id="blogAction" class="com.blog.action.GetBlogAction">
         <property name="sm" ref="bs"/>
      </bean>
      

  4.   

    struts2-spring-plugin-2.0.11.jar加上试试
      

  5.   

    你的hibernateTemplate的属性是default,所以在其子类中是不可见的。可以:
    1.把
    list = (List<Blog>) hibernateTemplate.find("from Blog");
    改成
    list = (List<Blog>) getHibernateTemplate().find("from Blog");
    2.把你的hibernateTemplate的属性改成protected。
    推荐使用第一种方法
      

  6.   

    struts2-spring-plugin-2.0.11.jar加上试试这个东西我是加有的!
      

  7.   


    第一种方法我用过的!也不行!第二种方法,我改为public都不行的!
      

  8.   

    blogDAOImpl继承superDAO继承HibernateDaoSupport。
      

  9.   

    一般都是继承HibernateDaoSupport 不过 你这样也可以 你是用的@Component 注解方式,你没有加上 扫描注解的配置么?<context:component-scan base-package="com.registration.*" ></context:component-scan>
      

  10.   

     @Resource(name="blogDAO")
    public void setBlogDAO(BlogDAO blogDAO) {
       System.out.println("set blogDAO000000000000000000000");    System.out.println(blogDAO);
           
    this.blogDAO = blogDAO;

    }
    public void addBlog(Blog blog) {
    System.out.println("blog service impl");
    // blog.setPath("path");
    System.out.println("ab:"+blog.getBlogAbstract()); System.out.println(blogDAO);
        blogDAO.save(blog);
    都在同一个类中,红色的都有输出,但是 blogDAO.save(blog)就为空指针了,blog是不空的!
      

  11.   

    这样写试试: 
    <bean id="super" class="com.blog.dao.superDAO">
             <property name="hibernateTemplate" ref="hibernateTemplate">
    </bean> <bean id="bs" class="com.blog.dao.blogDAOImpl">
             <property name="hibernateTemplate" ref="hibernateTemplate">
    </bean>  我遇到过这个问题在子类dao中也要注入一遍,否则不行,报空指针。
    但不知到什么原因,期待高手解答。
      

  12.   

    能让我瞧瞧你的项目吗?[email protected]
      

  13.   

    blogDAO这个是否为空。
    否则直接将HibernateTemplate注入的需要的地方,看是否为空。
      

  14.   

    你可以在superDao里面定义一个protected权限的HibernateTemplate对象,在blogDao里面要定义一个private HibernateTemplate对象,在blogDao的set方法里加上super.hibernateTemplate = hibernateTemplate;这样在使用superDao的方法时也同样给superDao的hibernateTemplate注入了实例。