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呢? 求大神指点。
<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呢? 求大神指点。
在这之上就写了这个private ChildDocDAO cdao;
public void setCdao(ChildDocDAO cdao) {
this.cdao = cdao;
}
List list = cdao.findAll();把这行注释掉,然后jsp里加个debug,看看里面有没有cdao这一项。
搭建的struts2 spring hibernate框架。
<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值么?
你有没有debug过?这问题不是特别难的,排除排除应该就能解决的
怎么debug jsp页面哈。 我是直接运行Action获取数据然后再显示到Show.jsp
struts2的配置文件的元素action的属性class注意要写成spring中配置的id值docAction。
看看取到的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.SQLServerDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/kd/DAO/ChildDoc.hbm.xml</value>
</list>
</property></bean>
新手啊你。<s:debug></s:debug>加在jsp的body里就行了,页面上就会出现一个标签,里面有action中的各项属性的名字和值。你看看有没有cdao这东西。
ApplicationConext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
ChildDocDAO cdao=(ChildDocDAO)ctx.getBean("ChildDocDAO");
SessionFactory sf=cdao.getSessionFactory();
System.out.print(sf==null);
我按你这样写
Tomcat启动就出错了。
可以进入setCdao方法。 那就注入没有问题。
那还有其他什么原因?
<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>
真没看出哪有错。
1.你加上getter方法试试。
2.检查你ioc配置的名字有没有问题,大小写,路径名之类的。
学长只能帮你到这儿了。
还有不要忘了struts2的配置:
<struts>
<constant name="struts.objectFactory" value="spring" />
...
</struts>
<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"
调用完set后,cDao对象不为null???你确定你按照8楼所说的做了吗?sessionFactory注入不成功,关联的对象也会不成功的,你一层一层找吧。
我自己没有写DAO, 那个ChildDocDAO是生成的。
我调试set方法看过了。cdao=ChildDocDAO 不为空。
贴下调试setCdao方法的参数
有啊。<bean id="ChildDocDAO" class="com.kd.DAO.ChildDocDAO"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean>
那按他们来说 ChildDocDAO小写呢?
没有啊。 我只创建了一个Action。。
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>此外,你的 xml文件 在web加载了么
1.ChildDocDAO到底是接口还是实现类。如果是接口,那肯定报错。
2.如果ChildDocDAO是实现类,private ChildDocDAO cdao;改下名字,似乎起的不太对
还有调试cdao不为空之前肯定是由实例化action触发的,找到这个入口点,看后面使用的action为什么和这个入口不一致
然后写execute方法。
再在struts.xml文件里边配置这个Action
<action name="doc" class="com.kd.Action.DocAction">
......
</action>
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>
然后再注入什么的。 我现在的情况是 我没有写接口 完全是由Hibernate自动生成的ChildDoc实例和ChildDocDAO,我没有动过, 然后就自己创建的Action写上面发过的代码。 就酱紫。
一:
<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>