applicationContext.xml文件内容 spring注入<bean id="docAction" class="com.kd.Action.DocAction">
      <property name="cdao">
       <ref bean="ChildDocDAO" />
      </property>
</bean>
Action代码  ChildDocDAO为hibernate自动生成的DAOprivate ChildDocDAO cdao;
public void setCdao(ChildDocDAO cdao) {
     this.cdao = cdao;
}public String execute(){
    HttpServletRequest request = ServletActionContext.getRequest();    List list = cdao.findAll();
    HttpSession sess = request.getSession();
sess.setAttribute("docList", list);

if(list.size()>0)
{
return SUCCESS;
}
else {
return ERROR;
}
}
调试到List list = cdao.findAll();这,  cdao为空。
然后就报NullPointerException 空指针错误了。
cdao为什么是null呢?   求大神指点。

解决方案 »

  1.   

    List list = cdao.findAll();这句话之前你声明过cdao么?把List list = cdao.findAll();所在类的代码贴出来看看呢。
      

  2.   


    在这之上就写了这个private ChildDocDAO cdao; 
    public void setCdao(ChildDocDAO cdao) {
          this.cdao = cdao; 
    }
      

  3.   

    execute。你是用的struts吧?
    List list = cdao.findAll();把这行注释掉,然后jsp里加个debug,看看里面有没有cdao这一项。
      

  4.   

    我有怀疑楼主所引用的bean ChildDocDAO有没有定义好,而且bean属性值应该是其name或id值(一般小写),这个怎么看都象类名
      

  5.   


    搭建的struts2 spring hibernate框架。
      

  6.   

    <bean id="ChildDocDAO" class="com.kd.DAO.ChildDocDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <bean id="docAction" class="com.kd.Action.DocAction">
          <property name="cdao">
           <ref bean="ChildDocDAO" />
          </property>
    </bean>
    下面的bean不是上面个bean的ID值么?
      

  7.   

    那同样检查下sessionFactory有没有注入成功
      

  8.   


    你有没有debug过?这问题不是特别难的,排除排除应该就能解决的
      

  9.   


    怎么debug jsp页面哈。   我是直接运行Action获取数据然后再显示到Show.jsp
      

  10.   

    struts2吗,贴个配置文件上来看看,
    struts2的配置文件的元素action的属性class注意要写成spring中配置的id值docAction。
      

  11.   

    context.lookup('sessionFactory')
    看看取到的sessionFactory里面属性什么的对不对
      

  12.   


    有注入。 <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.SQLServerDialect
    </prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
    <value>com/kd/DAO/ChildDoc.hbm.xml</value>
                            </list>
    </property></bean>
      

  13.   


    新手啊你。<s:debug></s:debug>加在jsp的body里就行了,页面上就会出现一个标签,里面有action中的各项属性的名字和值。你看看有没有cdao这东西。
      

  14.   

    最简单的方法写个测试类main函数
    ApplicationConext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
    ChildDocDAO cdao=(ChildDocDAO)ctx.getBean("ChildDocDAO");
    SessionFactory sf=cdao.getSessionFactory();
    System.out.print(sf==null);
      

  15.   


    我按你这样写
    Tomcat启动就出错了。
      

  16.   

    ChildDoc.hbm.xml看看你的这个文件呢
      

  17.   

    在方法setCdao处打一个断点,看看注入的时候是否进入了set方法,如果进入,说明注入没有问题,没有进入那就找配置的问题吧。
      

  18.   


    可以进入setCdao方法。  那就注入没有问题。
    那还有其他什么原因?
      

  19.   


    <hibernate-mapping>
        <class name="com.kd.DAO.ChildDoc" table="ChildDoc" schema="dbo" catalog="Test">
            <id name="childDocId" type="java.lang.Integer">
                <column name="ChildDocID" />
                <generator class="native" />
            </id>
            <property name="childDocName" type="java.lang.String">
                <column name="ChildDocName" not-null="true" />
            </property>
            <property name="childDocVersion" type="java.lang.String">
                <column name="ChildDocVersion" not-null="true" />
            </property>
            <property name="childDocStatus" type="java.lang.String">
                <column name="ChildDocStatus" not-null="true" />
            </property>
            <property name="childDocTime" type="java.lang.String">
                <column name="ChildDocTime" not-null="true" />
            </property>
            <property name="childDocRe" type="java.lang.String">
                <column name="ChildDocRe" />
            </property>
            <property name="childDocNum" type="java.lang.Integer">
                <column name="ChildDocNum" not-null="true" />
            </property>
        </class>
    </hibernate-mapping>
      

  20.   


    真没看出哪有错。
    1.你加上getter方法试试。
    2.检查你ioc配置的名字有没有问题,大小写,路径名之类的。
    学长只能帮你到这儿了。
      

  21.   

    先试试是否可以实现任何注入吧看其中(2) 注入引用类型http://hi.baidu.com/shirdrn/item/c70a6bca0950a30b0ad93aa1
      

  22.   

    tomcat报什么错呢?是否缺少struts2-spring-plugin*.jar?
    还有不要忘了struts2的配置:
    <struts>
           <constant name="struts.objectFactory" value="spring" />
           ...
    </struts>
      

  23.   

    又一次我做项目也是出现了这个问题 明明什么配置文件都配好了,但是注入进来的Dao层就是为空,你知道最后是怎么解决的吗 那是因为我引用的那个dao是我写的 我在自己的配置文件定义了 但是同事要引用 他也在他自己的文件中定义了 结果两个dao的ID是一样的 注入的时候就来是空的。
      

  24.   


    <bean id="ChildDocDAO" class="com.kd.DAO.ChildDocDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <bean id="docAction" class="com.kd.Action.DocAction">
          <property name="cdao">
           <ref bean="ChildDocDAO" />
          </property>
    </bean>
    目测是注入问题:ChildDocDAO  声明就是有问题的,应该为他的实现类, 你这样做相当于 ChildDocDAO dao = new ChildDocDAO () ;IOC反射原理其实 实现类没有被创建的。
     目测问题2:<bean id="docAction" class="com.kd.Action.DocAction">       <property name="cdao">           <ref bean="ChildDocDAO" />       </property> </bean> id="docAction" 改成 name="docAction"
      

  25.   

    这个spring配置一小段 其实就出现了两个错误,,难道 大家没看出来吗 ? 
      

  26.   


    调用完set后,cDao对象不为null???你确定你按照8楼所说的做了吗?sessionFactory注入不成功,关联的对象也会不成功的,你一层一层找吧。
      

  27.   


    我自己没有写DAO,  那个ChildDocDAO是生成的。
      

  28.   


    我调试set方法看过了。cdao=ChildDocDAO 不为空。
      

  29.   


    贴下调试setCdao方法的参数
      

  30.   

    别忘了在<bean id="docAction" class="com.kd.Action.DocAction">之前定义bean ChildDocDAO
      

  31.   


    有啊。<bean id="ChildDocDAO" class="com.kd.DAO.ChildDocDAO">         <property name="sessionFactory">             <ref bean="sessionFactory" />         </property>     </bean> 
      

  32.   


    那按他们来说  ChildDocDAO小写呢?
      

  33.   

    调试时看了cdao不为空,而使用时又为空,就是说用的是两个不同的action实例了?
      

  34.   


    没有啊。  我只创建了一个Action。。
      

  35.   

    web.xml里面少一个  startup相关的Filter类加上这个  <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>此外,你的 xml文件 在web加载了么
      

  36.   

    如下几种方式试试。
    1.ChildDocDAO到底是接口还是实现类。如果是接口,那肯定报错。
    2.如果ChildDocDAO是实现类,private ChildDocDAO cdao;改下名字,似乎起的不太对
      

  37.   

    一个Action类不代表就只有一个实例,action怎么创建的最好贴一下
    还有调试cdao不为空之前肯定是由实例化action触发的,找到这个入口点,看后面使用的action为什么和这个入口不一致
      

  38.   

    我创建Action就是new一个类,然后继承ActionSupport
    然后写execute方法。
    再在struts.xml文件里边配置这个Action
    <action name="doc" class="com.kd.Action.DocAction">
    ......
    </action>
      

  39.   

    会自动注入的action是不是不应该由你手动new,而是由框架自己的方式来实例化?
      

  40.   

    private ChildDocDAO cdao;   // ChildDocDAO改为其接口
    public void setCdao(ChildDocDAO cdao) {
         this.cdao = cdao;
    }public String execute(){
        HttpServletRequest request = ServletActionContext.getRequest();    List list = cdao.findAll();
        HttpSession sess = request.getSession();
    sess.setAttribute("docList", list);

    if(list.size()>0)
    {
    return SUCCESS;
    }
    else {
    return ERROR;
    }
    }
    <!--这里可以直接注入cdao么?我也忘了,试试吧-->
    <bean id="cdao" class="com.kd.DAO.ChildDocDAO"> 
            <property name="sessionFactory">
                <ref bean="sessionFactory" />
            </property>
    </bean>
      

  41.   

    我在网上找些资料,  那些例子都会有写 接口、接口实现类
    然后再注入什么的。  我现在的情况是 我没有写接口  完全是由Hibernate自动生成的ChildDoc实例和ChildDocDAO,我没有动过, 然后就自己创建的Action写上面发过的代码。 就酱紫。
      

  42.   

    看了下  你这样试下
    一:
    <bean id="docAction" class="com.kd.Action.DocAction">
          <property name="cdao">
              <ref bean="ChildDocDAO" />
          </property>
    </bean> 后面加上 scope="prototype"二:你的sessionFactory一定要确保有dataSource  
    三:ChildDocDAO要继承HibernateDaoSuppport,把sessionFactory拆开写 写成这样的
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
    <!-- org.hibernate.dialect.Oracle10gDialect -->
    </prop>
    <prop key="hibernate.cache.provider_class">
    org.hibernate.cache.HashtableCacheProvider
    </prop>
    </props>
    </property>
    <property name="configLocations">
    <list>
    <value>
    classpath:hibernate.cfg.xml
    </value>
    </list>
    </property>

    </bean>
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <bean id="ChildDocDAO" class="com.kd.DAO.ChildDocDAO">
            <property name="hibernateTemplate">
                <ref bean="hibernateTemplate" />
            </property>
        </bean>
      

  43.   

    没有在配置文件里设置autowire="byName" 类似的注入类型吧。
      

  44.   

    感谢大家对我的帮助啊。  特别感谢coder_dai 和 dracularking 的耐心教导。我按照网上重新写了一个。  现在好了。