先看异常:
信息: Server startup in 11922 ms
111111111111111111
2009-8-26 11:51:45 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception
java.lang.NullPointerException
at com.yb.actionserver.loginactionserver.checkUser(loginactionserver.java:22)
at com.yb.struts.action.LoginAction.execute(LoginAction.java:45)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
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.yb.SetEncoding.EncodingFilter.doFilter(EncodingFilter.java:28)
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:228)
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:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)
ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"   destroy-method="close">
         <property name="driverClass" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
         <property name="jdbcUrl" value="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=webpro;"/>            
         <property name="user" value="sa"/>
         <property name="password" value="sa"/>
         
         <property name="initialPoolSize" value="3"/>
         <property name="maxIdleTime" value="3600"/>
         <property name="minPoolSize" value="2"/>
         <property name="maxPoolSize" value="200"/>
         <property name="idleConnectionTestPeriod" value="30000"/>
         <property name="acquireIncrement" value="20"/>
         <property name="acquireRetryAttempts" value="30"/>
         <property name="acquireRetryDelay" value="1000"/>
         <property name="autoCommitOnClose" value="false"/>
         <property name="automaticTestTable" value="leihailongtabletest"/>
         <property name="breakAfterAcquireFailure" value="false"/>
         <property name="checkoutTimeout" value="30000"/>
         <property name="maxStatements" value="10000"/>
         <property name="maxStatementsPerConnection" value="0"/>
         <property name="numHelperThreads" value="10"/>
         <property name="propertyCycle" value="100"/>
         <property name="testConnectionOnCheckout" value="false"/>
         <property name="testConnectionOnCheckin" value="false"/>
</bean>
<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
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
 <!-- 修改属性为update、create、create-drop,<prop name="hibernate.hbm2ddl.auto">update</prop> -->
 <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
 <prop key="hibernate.cache.use_query_cache">true</prop>   
             <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
             <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> 
             <!-- <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate.xml</prop>   -->
</props>
</property>
<property name="mappingResources">
<list>
<value>com/yb/vo/Userinfo.hbm.xml</value></list>
</property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
   </bean>
   
   <bean id="daoimpl" class="com.yb.daoImpl.DAOImpl">
    <property name="hibernateTemplate">
    <ref bean="hibernateTemplate"/>
    </property>
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
   </bean>
   
   <bean id="loginactionserver" class="com.yb.actionserver.loginactionserver">
    <property name="objectDAO">
    <ref bean="daoimpl"/>
    </property>
   </bean>
   <!-- 
   <bean name="/login" class="com.yb.struts.action.LoginAction">
    <property name="objectDAO">
    <ref bean="daoimpl"/>
    </property>
   </bean>
    -->
</beans>

解决方案 »

  1.   

    LoginAction.java
    /*
     * Generated by MyEclipse Struts
     * Template path: templates/java/JavaClass.vtl
     */
    package com.yb.struts.action;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;import com.yb.actionserver.loginactionserver;
    import com.yb.struts.form.LoginForm;/** 
     * MyEclipse Struts
     * Creation date: 07-17-2009
     * 
     * XDoclet definition:
     * @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true"
     * @struts.action-forward name="success" path="/index.jsp"
     */
    public class LoginAction extends Action {
    /*
     * Generated Methods
     */
    private loginactionserver loginactionserver=new loginactionserver();
    /** 
     * Method execute
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
    String userString=loginForm.getUsername();
    String userPassword=loginForm.getUserpassword();
    //Logger logger=Logger.getLogger(LoginAction.class);//log4j
    if (loginactionserver.checkUser(userString)) {
    if (loginactionserver.checkPass(userString, userPassword)) {
    //用户名和密码判断成功,应该检查人员相关状态。
    return mapping.findForward("success");
    }else {
    request.setAttribute("passworderror",com.yb.struts.TS.LoginAction_execute_usernameerror);
    return mapping.findForward("faliure");
    }
    }else {
    request.setAttribute("usernameerror", com.yb.struts.TS.LoginAction_execute_passworderror);
    return mapping.findForward("failure");
    }
    }
    }
    loginactionserver.java
    package com.yb.actionserver;import java.util.List;import com.yb.dao.ObjectDAO;public class loginactionserver {
    public ObjectDAO objectDAO; public ObjectDAO getObjectDAO() {
    return objectDAO;
    } public void setObjectDAO(ObjectDAO objectDAO) {
    this.objectDAO = objectDAO;
    }

    public boolean checkUser(String username)
    {
    String hql="from Userinfo as u where u.name = '"+username+"'";
    System.out.println("111111111111111111");
    List userList=this.objectDAO.ObjectHqlSelect(hql);
    if (userList.size()>0) {
    return true;
    }else {
    return false;
    }
    }
    public boolean checkPass(String username,String password)
    {
    String hql="from Userinfo as u where u.name='"+username+"' and u.userPassword='"+password+"'";
    List list=this.objectDAO.ObjectHqlSelect(hql);
    if (list.size()>0) {
    return true;
    }else {
    return false;
    }
    }
    }ObjectDAO.java
    package com.yb.dao;import java.util.List;public interface ObjectDAO {
    public void ObjectSave(Object object);
    public void ObjectSaveOrUpdate(Object object);
    public List ObjectHqlSelect(String hql);
    public List ObjectSqlSelect(String sql);
    public void ObjectDelete(Object object);
    public void ObjectUpdate(String hql);
    }DAOImpl.java
    package com.yb.daoImpl;import java.util.List;import org.hibernate.Query;
    import org.hibernate.Session;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.yb.dao.ObjectDAO;public class DAOImpl extends HibernateDaoSupport implements ObjectDAO {

    public void ObjectSave(Object object) {
    // TODO Auto-generated method stub
    this.getHibernateTemplate().save(object);
    }
    public void ObjectSaveOrUpdate(Object object) {
    // TODO Auto-generated method stub
    this.getHibernateTemplate().saveOrUpdate(object);
    }
    public List ObjectHqlSelect(String hql) {
    // TODO Auto-generated method stub
    System.out.println("------"+this.getSession());
    Query query=this.getSession().createQuery(hql);
    List list=query.list();
    this.getSession().close();
    this.getSessionFactory().close();
    return list;
    }
    public List ObjectSqlSelect(String sql) {
    // TODO Auto-generated method stub
    System.out.println("------"+this.getSession());
    Query query=this.getSession().createSQLQuery(sql);
    List list=query.list();
    this.getSession().close();
    this.getSessionFactory().close();
    return list;
    }
    public void ObjectDelete(Object object) {
    // TODO Auto-generated method stub
    this.getHibernateTemplate().delete(object);
    }
    public void ObjectUpdate(String hql) {
    // TODO Auto-generated method stub
    Session session=this.getSession();
    Query query=session.createQuery(hql);
    query.executeUpdate();
    this.getSession().close();
    }
    }
      

  2.   

    先用MyEclipse自动生成,等跑起来以后再慢慢对照吧。
      

  3.   

    at com.yb.struts.action.LoginAction.execute(LoginAction.java:45)
    这个地方NullPointerException   </bean>
       
       <bean id="loginactionserver" class="com.yb.actionserver.loginactionserver">
               <property name="objectDAO">
                   <ref bean="daoimpl"/>
               </property>
       </bean>
       <!-- 
       <bean name="/login" class="com.yb.struts.action.LoginAction">
               <property name="objectDAO">
                   <ref bean="daoimpl"/>
               </property>
       </bean>
        -->

    </beans>为什么要注释掉?如果注释掉,那么objectDAO肯定是空指针!LoginAction.java:45对应什么代码啊?
      

  4.   

    at com.yb.actionserver.loginactionserver.checkUser(loginactionserver.java:22) 
    对应语句是:
    loginactionserver.checkUser()里面
    List userList=this.objectDAO.ObjectHqlSelect(hql);
    at com.yb.struts.action.LoginAction.execute(LoginAction.java:45) 
    对应语句是:
    loginaction。java里面
    if (loginactionserver.checkUser(userString)) {
    }
      

  5.   

    那正好了,objectDAO没有被spring注入,
    List userList=this.objectDAO.ObjectHqlSelect(hql); //loginactionserver.java:22
    是空指针,再往上抛
    loginactionserver.checkUser(userString)) 
    就到这里了
      

  6.   

    failure, not ("faliure");  来学习的
      

  7.   

    嗯。我想的是一个action对应一个actionserver层,actionserver层去跟数据库那层访问
    action--》actionserver--》ObjectDAO-->DAOImpl
    这样的配置有问题嘛?
      

  8.   


    你说的对,这个没问题,但是spring注入的时候是一层套一层,如果没有入住就会报空指针异常!
      

  9.   

    呵呵
    谢谢大家。问题已经解决。
    加了一层。
    <bean id="loginactionserver" class="com.yb.actionserver.loginactionserver">
        <property name="objectDAO">
        <ref bean="daoimpl"/>
        </property>
       </bean>
    <bean name="/login" class="com.yb.struts.action.LoginAction">
        <property name="loginactionserver">
        <ref bean="loginactionserver"/>
        </property>
       </bean>
      

  10.   

    空指针错误,建议debug跟踪下