这是dao代码IBookDAOImpl代码package com.niit.dao.impl;import java.util.List;import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.niit.dao.IBookDAO;
import com.niit.vo.Book;
import com.niit.vo.Bookcat;public class IBookDAOImpl extends HibernateDaoSupport implements IBookDAO {
public IBookDAOImpl() {
System.out.println("构造方法 IBookDAOImpl");
} public boolean delete(int id) {
// TODO Auto-generated method stub
return false;
} public boolean insert(Book b) {
// TODO Auto-generated method stub
return false;
} public List<Book> queryAll() {
System.out.println("111111111");
String hql = "FROM Book AS b";
List list = (List<Book>)super.getSession().createQuery(hql).list();
System.out.println("2222222222");
System.out.println(list.size());
return list;
} public Book selectById(int id) {
// TODO Auto-generated method stub
return null;
} public boolean update(Book b) {
// TODO Auto-generated method stub
return false;
}
public List<Book> queryByBookcat(Bookcat bookcat) {
System.out.println("11111111");
String hql = "FROM Book AS b where b.catid = ?";
Query q = super.getSession().createQuery(hql);
q.setInteger(0, bookcat.getCatid());
List<Book> list = q.list();
System.out.println("2222222");
return list;
}
}
IBookcatDaoImpl代码package com.niit.dao.impl;import java.util.List;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.niit.dao.IBookcatDao;
import com.niit.vo.Book;
import com.niit.vo.Bookcat;public class IBookcatDaoImpl extends HibernateDaoSupport implements IBookcatDao {
public IBookcatDaoImpl() {
System.out.println("构造方法      IBookcatDaoImpl");
} public void delete(int id) throws Exception {
// TODO Auto-generated method stub } public void insert(Bookcat bc) throws Exception {
// TODO Auto-generated method stub } public List<Bookcat> queryAll() throws Exception {
String hql = "FROM Bookcat AS bc";
List<Bookcat> list = (List<Bookcat>)super.getSession().createQuery(hql).list();
System.out.println(list.size());
return list;
} public Bookcat queryById(int itemid) throws Exception {
// TODO Auto-generated method stub
return null;
} public void update(Bookcat bc) throws Exception {
// TODO Auto-generated method stub }}

解决方案 »

  1.   

    这是applicationContext.xml文件中的配置项<bean id="ibookdao" class="com.niit.dao.IBookDAO" abstract="true"></bean>
    <bean id="ibookdaoimpl" class="com.niit.dao.impl.IBookDAOImpl" parent="ibookdao">
    <property name="hibernateTemplate">
    <ref bean="hibernateTemplate"/> 
    </property>
    </bean>

    <bean id="ibookcatdao" class="com.niit.dao.IBookcatDao" abstract="true"></bean>
    <bean id="ibookcatdaoimpl" class="com.niit.dao.impl.IBookcatDaoImpl" parent="ibookcatdao">
    <property name="hibernateTemplate">
    <ref bean="hibernateTemplate"/> 
    </property>

    </bean>
    <bean name="/jsp/index" class="com.niit.struts.action.IndexAction">
    <property name="ibookdao">
    <ref local="ibookdaoimpl"/>
    </property>
    <property name="ibookcatdao">
    <ref local="ibookcatdaoimpl"/>
    </property>
    </bean>
    这是struts-config.xml中的相关配置  <form-beans >
    <form-bean name="userForm" type="com.niit.struts.form.UserForm" />
    <form-bean name="indexForm" type="org.apache.struts.action.DynaActionForm" />  </form-beans> <action attribute="indexForm" input="/jsp/errors.jsp"
    name="indexForm" parameter="status" path="/jsp/index" scope="request"
    type="com.niit.struts.action.IndexAction">
    <forward name="indexdo" path="/jsp/index.jsp"></forward>
    </action>
      

  2.   

    这是IndexAction.java代码 功能是为了点击一个衔接进入主页,而主页的内容需要从数据库中取出,然后显示出来/*
     * Generated by MyEclipse Struts
     * Template path: templates/java/JavaClass.vtl
     */
    package com.niit.struts.action;import java.util.List;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.action.DynaActionForm;
    import org.apache.struts.actions.DispatchAction;
    import org.springframework.context.support.ClassPathXmlApplicationContext;import com.niit.dao.IBookDAO;
    import com.niit.dao.IBookcatDao;
    import com.niit.dao.impl.IBookDAOImpl;
    import com.niit.dao.impl.IBookcatDaoImpl;
    import com.niit.vo.Book;
    import com.niit.vo.Bookcat;/**
     * MyEclipse Struts Creation date: 07-02-2007
     * 
     * XDoclet definition:
     * 
     * @struts.action path="/index" name="indexForm" input="/form/index.jsp"
     *                parameter="status" scope="request" validate="true"
     */
    public class IndexAction extends DispatchAction {
    private IBookDAO ibookdao;
    private IBookcatDao ibookcatdao ; /*
     * Generated Methods
     */
    public IBookDAO getIbookdao() {
    return ibookdao;
    }
    public IBookcatDao getIbookcatdao() {
    return ibookcatdao;
    }
    public void setIbookcatdao(IBookcatDao ibookcatdao) {
    System.out.println("=====set  ibookcatdao ========");
    this.ibookcatdao = ibookcatdao;
    }
    public void setIbookdao(IBookDAO ibookdao) {
    System.out.println("======set  ibookdao ===");
    this.ibookdao = ibookdao;
    }
    /**
     * Method execute
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     */
    public ActionForward list(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    DynaActionForm indexForm = (DynaActionForm) form;
    // 查询信息
    // ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
    // "applicationContext.xml");
    // ibookdao = (IBookDAOImpl)ctx.getBean("ibookdaoimpl");
    // ibookcatdao = (IBookcatDaoImpl)ctx.getBean("ibookcatdaoimpl");
    List<Book> list = null;
    List<Bookcat> all = null;
    try {
    list  =  this.ibookdao.queryAll();
    all =  this.ibookcatdao.queryAll();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    request.setAttribute("list", list);
    request.setAttribute("all", all);
    return mapping.findForward("indexdo");
    }}
    现在的问题是用sping注入不了值,taomcat启动的时候显示两个dao的构造方法和set方法都调用了,但是报空指针错误
    构造方法 IBookDAOImpl
    构造方法      IBookcatDaoImpl
    ======set  ibookdao ===
    =====set  ibookcatdao ========
    java.lang.NullPointerException
    at com.niit.struts.action.IndexAction.list(IndexAction.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.niit.filter.EncodingFilter.doFilter(EncodingFilter.java:21)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
    at java.lang.Thread.run(Thread.java:619)
      但是如果我在indexaction中不使用set get方法,使用注释的那段代码,即如下代码,直接从配置文件读取,却正常使用,能取出值。 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
    ibookdao = (IBookDAOImpl)ctx.getBean("ibookdaoimpl");
    ibookcatdao = (IBookcatDaoImpl)ctx.getBean("ibookcatdaoimpl");
    不知道是怎么回事?不知道有没有人知道原因
      

  3.   

    this.getSession().createQuery(hql).list();
      

  4.   

    去掉<bean id="ibookcatdao" class="com.niit.dao.IBookcatDao" abstract="true"></bean>
         删除红色   <bean id="ibookcatdaoimpl" class="com.niit.dao.impl.IBookcatDaoImpl" parent="ibookcatdao">
                <property name="hibernateTemplate">
                <ref bean="hibernateTemplate"/> 
            </property>
            </bean>
      

  5.   

    楼主,很明显spring的注入已经调用了,通过打印就能看出来,但是当你调用的时候又为null了,这说明你在点击页面的时候生成的action已经不是spring生成的action了,而是struts框架自己生成的action,所以我怀疑你是不是没有指定action的生成方式为spring注入。建议你检查一下你的配置文件。关于struts1如何与spring整合,网上有很多例子。
      

  6.   

    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    这里有问题吧,是不是你struts的配置文件有问题呀。加<controller/>了么?
    <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
      

  7.   

    如果要是没加<controller/>没配置的话,不知道 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
      <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
     </plug-in> 这个配置了没有。
    还有就是如5喽所说,不清楚lz那么配置有什么特殊用意??
      

  8.   


    <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>
      <message-resources parameter="com.niit.struts.ApplicationResources" />
      <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
       <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
      </plug-in>这些都配了 
      

  9.   


    学习spring时候看到的,尝试用一下,
      不过按照五楼的改回去了,还是一样的错误 郁闷
      

  10.   

    应该是struts的控制权没有交给spring,缺少相应的<controller>和<plugin>,还不行的话看看你spring的web包导了没?
      

  11.   

    还有个地,web.xml里配置了不。你看异常根本就没报spring相关的异常信息。
      

  12.   


    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
      <filter-name>encoding</filter-name>
      <filter-class>com.niit.filter.EncodingFilter</filter-class>
      <init-param>
    <param-name>charset</param-name>
    <param-value>gbk</param-value>
    </init-param>
      </filter>
      <filter-mapping> 
        <filter-name>encoding</filter-name> 
        <url-pattern>/*</url-pattern> 
      </filter-mapping>
      
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/classes/applicationContext.xml
    </param-value>
    </context-param>
    <servlet>
    <servlet-name>context</servlet-name>
    <servlet-class>
    org.springframework.web.context.ContextLoaderServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>  
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
    </web-app>
    web的配置了
      

  13.   

            <bean name="/jsp/index" class="com.niit.struts.action.IndexAction">
                <property name="ibookdao">
                    <ref local="ibookdaoimpl"/>
                </property>
                <property name="ibookcatdao">
                    <ref local="ibookcatdaoimpl"/>
                </property>
            </bean>应该是这个action bean里面那2个没注入成功,试过用<context:annotation-config /> 用annotation注入吗
      

  14.   

    这个不会
    我奇怪的是  构造方法和set方法都已经调用了。为什么注入不成功呢,我在调用那个查询前加了打印语句,显示两个都是null值
      

  15.   

    action中写上 IBookDAO ibookdao和IBookcatDao ibookcatdao的getter!!!!
      

  16.   


        public IBookDAO getIbookdao() {
            return ibookdao;
        }
        public IBookcatDao getIbookcatdao() {
            return ibookcatdao;
        }
    action中写上了
      

  17.   

    把servlet换成listener试试。
    <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener>