这个是报的错误信息:2010-3-14 18:56:21 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception
java.lang.NullPointerException
at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
at org.hibernate.type.EntityType.resolve(EntityType.java:303)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at com.hpxx.dao.ManagerDao.checkManagerLogin(ManagerDao.java:25)
at com.hpxx.struts.action.LoginAcion.execute(LoginAcion.java:41)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
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:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.hpxx.filter.EncodingFilter.doFilter(EncodingFilter.java:31)
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:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
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:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
action中的代码://声明管理员对象的数据操作对象
private ManagerDao manager ;

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//获得用户输入的管理员对象
Manager man = (Manager)form;
System.out.println(manager);
//创建session对象,用于储存全局值
HttpSession session = request.getSession();
System.out.println(man.getAccount()+"---"+man.getPassword());
//根据管理员对象查询出是否存在该管理员
List list = this.manager.checkManagerLogin(man);

//如果管理员存在就将管理员的信息存放在session中
if(list.size() > 0){
man = (Manager)list.get(0);
session.setAttribute("userName",man.getAccount());
session.setAttribute("grade",man.getGrade());
session.setAttribute("id", man.getManagerId());
session.setAttribute("manager",man);
response.sendRedirect("/ElectronicOrder/index.jsp");
}
//如果验证失败就提示用户用户名或者密码输入错误
else{
request.setAttribute("error","1");
request.getRequestDispatcher("/login.jsp").forward(request, response);
} return null;

}

public void setManagerDAO(ManagerDao manager){
this.manager = manager;

}
dao代码:public List checkManagerLogin(Manager man){
String hql = "from Manager where account = :account and password = :password";
List list = null;
try{ Query obj = getSession().createQuery(hql);
obj.setParameter("account", man.getAccount());
obj.setParameter("password", man.getPassword());
System.out.println("=============================================================");
System.out.println("*********");
System.out.println(obj.list().size());
System.out.println("=============================================================");
list = obj.list();
//System.out.println(list.size());
return list;
}catch(RuntimeException re){
throw re;
}finally{
closeSession();
}
}
用于测试的main方法:
public static void main(String[] args){
ManagerDao m = new ManagerDao();
Manager man = new Manager();
man.setAccount("test");
man.setPassword("test");
System.out.println(m.checkManagerLogin(man).size());
}我在main方法里面运行是成功的,但是我在action里面运行的话就在   
obj.list();这里报错了,
哪位大哥帮我看下啊!

解决方案 »

  1.   

    在Action里面注入了Dao类没有呢?
      

  2.   

    我根据system打印的记录来测试的,在action里面打印dao对象的值是:com.hpxx.dao.ManagerDao@b80017,
    进入了dao里面的
      

  3.   

    at com.hpxx.dao.ManagerDao.checkManagerLogin(ManagerDao.java:25)
    这个方法内有空指针,可能的地方是:1、检查一下getSession()是不是空
    2、man是不是空
      

  4.   

    在action中打印managerDao的值是:com.hpxx.dao.ManagerDao@f3e133
    在dao中打印session的值是:session:SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])都是正确的,但是执行System.out.println(obj.list().size());这句代码的时候就报错了
      

  5.   

    检查一下dao是否注入了。仔细看看。一般都是粗心造成的
      

  6.   

    dao是注入成功的,因为已经进入方法里面了,我再main方法里面测试都是成功的,在action里面就报错了
      

  7.   

    action中dao的值:com.hpxx.dao.ManagerDao@37a04c
    form对象account和password的值:test---test
    dao中session的值:session:SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])
    =============================================================
    *********
    dao中Query(obj)的值:QueryImpl(from Manager where account = :account and password = :password)都是正确的啊
      

  8.   


    public List checkManagerLogin(Manager man){
            String hql = "from Manager where account = :account and password = :password";
            List list = null;
            try{            Query obj = getSession().createQuery(hql);
                obj.setParameter("account", man.getAccount());
                obj.setParameter("password", man.getPassword());
                System.out.println("=============================================================");
                System.out.println("*********");
                System.out.println(obj.list().size());
                System.out.println("=============================================================");
                list = obj.list();
                           return list;
            }catch(RuntimeException re){
                throw re;
            }finally{
                closeSession();
            }
        }            System.out.println("=============================================================");
                System.out.println("*********");
                System.out.println(obj.list().size());
                System.out.println("=============================================================");把这个放在    list = obj.list();
    这个的后面,如果没有判断list是否为空,直接调用size方法是会爆空指针错误的~~要不你输正确的用户名和密码试试~~还有 Manager man = (Manager)form;
            System.out.println(manager);
            //创建session对象,用于储存全局值
            HttpSession session = request.getSession();
            System.out.println(man.getAccount()+"---"+man.getPassword());
    你这个action对应的form是什么? 给你个对应的例子看看
    LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method
    // stub
    String username = loginForm.getUsername();
    String password = loginForm.getPassword();
    User user = new User();
    user.setUsername(username);
    user.setPassword(password);
     List list = this.manager.checkManagerLogin(user);
      

  9.   

    我把
    System.out.println("=============================================================");
    System.out.println("*********");
    System.out.println(obj.list().size());
    System.out.println("=============================================================");改成
    System.out.println("=============================================================");
    System.out.println("*********");
    System.out.println(obj.list());
    System.out.println("=============================================================");但是还是在System.out.println(obj.list());这一句的时候报错!
      

  10.   

    我把action里面改成这样
    //获得用户输入的管理员对象
    Manager man = (Manager)form;
    Manager m = new Manager();
    m.setAccount(man.getAccount());
    m.setPassword(man.getPassword());
    System.out.println(manager+"----"+m.getAccount());
    //创建session对象,用于储存全局值
    HttpSession session = request.getSession();
    System.out.println(man.getAccount()+"---"+man.getPassword());
    //根据管理员对象查询出是否存在该管理员
    List list = this.manager.checkManagerLogin(m);dao里面的内容改成这样:/**
     * 该方法用于根据管理员登录的信息验证管理员的状态
     * @param man 管理员对象
     * @return list
     */
    public List checkManagerLogin(Manager man){
    String hql = "from Manager where account = :account and password = :password";
    List list = null;
    try{ Query obj = getSession().createQuery(hql);
    System.out.println("session:"+getSession());
    obj.setParameter("account", man.getAccount());
    obj.setParameter("password", man.getPassword());
    System.out.println("=============================================================");
    System.out.println("*********");
    System.out.println(obj);
    System.out.println(obj.list());
    System.out.println("=============================================================");
    list = obj.list();
    //System.out.println(list.size());
    return list;
    }catch(RuntimeException re){
    throw re;
    }finally{
    closeSession();
    }
    }
    但是还是在System.out.println(obj.list());这一句的时候报错
    我在main方法里面测试是这样写的:public static void main(String[] args){
    ManagerDao m = new ManagerDao();
    Manager man = new Manager();
    man.setAccount("test");
    man.setPassword("test");
    System.out.println(m.checkManagerLogin(man).size());

    OrderinfoDao o = new OrderinfoDao();
    System.out.println(o.getAllOrder(0, 10).size());
    }
    2次查询都是对的!为什么在main里面能够执行,在action里面就不能执行了呢?
      

  11.   

    空指针错误,肯定是在哪里有值没有传过去。楼主好好检查一下吧。还有就算是这样System.out.println也不应该报错啊
      

  12.   

    没有人遇见过这个问题吗?
     为什么在main方法里面能运行,在action里面就运行不了呢!
      

  13.   

    那就是man对象里的 
    account或password属性为null啦
      

  14.   

    man对象的account和password属性都是有值的。
    query对象也的有值的,但是一调用query对象的list方法就报空指针错误了
      

  15.   

    obj.list() 为空 当然会报错。
      

  16.   

     System.out.println(man.getAccount()+"---"+man.getPassword());
    这句话能打印你输入的账号和密码吧?
    这个账号和密码在db中存在吗?
    不存在,就会返回一个null, list = null时候, list.size()肯定会报错的
      

  17.   

    debug下就知道哪了~
    在   List list = this.manager.checkManagerLogin(man);
    这里设置断点,然后跳入方法debug就知道空指针在什么地方了~