功能描述:两个页面Login.jsp和Index.jsp。验真用户名和密码正确后进入Index.jsp,否则回到Login.jsp
问题:点击登录后,出现以下错误原因。不知道错在哪里了。
description The server encountered an internal error () that prevented it from fulfilling this request.
root cause 
java.lang.NullPointerException
vo.TuserDAO.findByExample(TuserDAO.java:68)
com.webapp.struts.action.LoginAction.execute(LoginAction.java:48)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
以下是部分代码:
LoginAction.java:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
Tuser tuser=new Tuser();
tuser.setLoginName(loginForm.getUsername());
tuser.setLoginPassword(loginForm.getUserpass());
TuserDAO tuserDao=new TuserDAO();
List result= (List) tuserDao.findByExample(tuser);
if (result.size()>0){
return mapping.findForward("success");
}
else{
return mapping.findForward("fail");
}
}TuserDAO.java:
public List findByExample(Tuser instance) {
log.debug("finding Tuser instance by example");
try {
List results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}applicationContext.xml:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://127.0.0.1:1433">
</property>
<property name="username" value="sa"></property>
<property name="password" value="sa"></property>
</bean>

解决方案 »

  1.   

    将你的
    if (result.size()>0){ 
    return mapping.findForward("success"); 

    else{ 
    return mapping.findForward("fail"); 
    } 改为if (result!=null && result.size()>0){ 
    return mapping.findForward("success"); 

    else{ 
    return mapping.findForward("fail"); 

      

  2.   

    java.lang.NullPointerException 
    vo.TuserDAO.findByExample(TuserDAO.java:68) 
    com.webapp.struts.action.LoginAction.execute(LoginAction.java:48) 
    空指针呀。是不是List results = getHibernateTemplate().findByExample(instance); log.debug("find by example successful, result size: " 
    + results.size()); 里面 results为空啦。查不到任何东西。这样这句就会出错。所以如果用户名和密码错误。你系统就会报空指针错误。如果用户名密码对,就能取到 所以就没错。
      

  3.   

    log.debug("find by example successful, result size: " + results.size()); 这行是(TuserDAO.java:68) 么?
      

  4.   


    TuserDAO.java 的68行是
    List results = getHibernateTemplate().findByExample(instance);
      

  5.   

    难道 getHibernateTemplate()这个是null?
      

  6.   

    对,如果68行是List results = getHibernateTemplate().findByExample(instance); 
    那就是getHibernateTemplate()为空,这个是DAO写的不标准,没继承
      

  7.   

    TuserDAO.java是MyEclipse自动生成的,以下是其全部代码:
    package vo;import java.util.List;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.hibernate.LockMode;
    import org.springframework.context.ApplicationContext;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;/**
     * A data access object (DAO) providing persistence and search support for Tuser
     * entities. Transaction control of the save(), update() and delete() operations
     * can directly support Spring container-managed transactions or they can be
     * augmented to handle user-managed Spring transactions. Each of these methods
     * provides additional information for how to configure it for the desired type
     * of transaction control.
     * 
     * @see vo.Tuser
     * @author MyEclipse Persistence Tools
     */public class TuserDAO extends HibernateDaoSupport {
    private static final Log log = LogFactory.getLog(TuserDAO.class);
    // property constants
    public static final String LOGIN_NAME = "Login_Name";
    public static final String LOGIN_PASSWORD = "Login_Password"; protected void initDao() {
    // do nothing
    } public void save(Tuser transientInstance) {
    log.debug("saving Tuser instance");
    try {
    getHibernateTemplate().save(transientInstance);
    log.debug("save successful");
    } catch (RuntimeException re) {
    log.error("save failed", re);
    throw re;
    }
    } public void delete(Tuser persistentInstance) {
    log.debug("deleting Tuser instance");
    try {
    getHibernateTemplate().delete(persistentInstance);
    log.debug("delete successful");
    } catch (RuntimeException re) {
    log.error("delete failed", re);
    throw re;
    }
    } public Tuser findById(java.lang.String id) {
    log.debug("getting Tuser instance with id: " + id);
    try {
    Tuser instance = (Tuser) getHibernateTemplate().get("vo.Tuser", id);
    return instance;
    } catch (RuntimeException re) {
    log.error("get failed", re);
    throw re;
    }
    } public List findByExample(Tuser instance) {
    log.debug("finding Tuser instance by example");
    try {
    List results = getHibernateTemplate().findByExample(instance);
    log.debug("find by example successful, result size: "
    + results.size());
    return results;
    } catch (RuntimeException re) {
    log.error("find by example failed", re);
    throw re;
    }
    } public List findByProperty(String propertyName, Object value) {
    log.debug("finding Tuser instance with property: " + propertyName
    + ", value: " + value);
    try {
    String queryString = "from Tuser as model where model."
    + propertyName + "= ?";
    return getHibernateTemplate().find(queryString, value);
    } catch (RuntimeException re) {
    log.error("find by property name failed", re);
    throw re;
    }
    } public List findByUserName(Object loginName) {
    return findByProperty(LOGIN_NAME, loginName);
    }

    public List findByUserPass(Object loginPassword) {
    return findByProperty(LOGIN_PASSWORD, loginPassword);
    } public List findAll() {
    log.debug("finding all Tuser instances");
    try {
    String queryString = "from Tuser";
    return getHibernateTemplate().find(queryString);
    } catch (RuntimeException re) {
    log.error("find all failed", re);
    throw re;
    }
    } public Tuser merge(Tuser detachedInstance) {
    log.debug("merging Tuser instance");
    try {
    Tuser result = (Tuser) getHibernateTemplate().merge(
    detachedInstance);
    log.debug("merge successful");
    return result;
    } catch (RuntimeException re) {
    log.error("merge failed", re);
    throw re;
    }
    } public void attachDirty(Tuser instance) {
    log.debug("attaching dirty Tuser instance");
    try {
    getHibernateTemplate().saveOrUpdate(instance);
    log.debug("attach successful");
    } catch (RuntimeException re) {
    log.error("attach failed", re);
    throw re;
    }
    } public void attachClean(Tuser instance) {
    log.debug("attaching clean Tuser instance");
    try {
    getHibernateTemplate().lock(instance, LockMode.NONE);
    log.debug("attach successful");
    } catch (RuntimeException re) {
    log.error("attach failed", re);
    throw re;
    }
    } public static TuserDAO getFromApplicationContext(ApplicationContext ctx) {
    return (TuserDAO) ctx.getBean("TuserDAO");
    }
    }
      

  8.   

    Tuser.hbm.xml的代码如下:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="vo.Tuser" table="TUser" schema="dbo" catalog="CAMAR">
            <id name="loginName" type="java.lang.String">
                <column name="Login_Name" length="20" />
                <generator class="assigned" />
            </id>
            <property name="loginPassword" type="java.lang.String">
                <column name="Login_Password" length="60" not-null="true" />
            </property>
        </class>
    </hibernate-mapping>
      

  9.   

    如果代码正确,DAO等是由工具生成的话,
    即使getHibernateTemplate().findByExample(instance);
    得不到结果,它最终还是会返回一个List,只不过这个List中只有空值,所以
    用result.size()>0也不会出错。出现这种错误没准是session为空了,
    要不你就看看你的配置文件,有没有把连接数据源的文件配置好。
      

  10.   

    DAO什么的都是从数据库中反向出来的?
      

  11.   


    TuserDAO.java就是从数据库中Tuser表反射生成的。
    applicationContext.xml内容也是自动生成的。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName"
    value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
    </property>
    <property name="url"
    value="jdbc:sqlserver://127.0.0.1:1433">
    </property>
    <property name="username" value="sa"></property>
    <property name="password" value="sa"></property>
    </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.SQLServerDialect
    </prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
    <value>vo/Tuser.hbm.xml</value></list>
    </property></bean>
    <bean id="TuserDAO" class="vo.TuserDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean></beans>
      

  12.   

    你spring配置文件里面sessionfactory注入了没有?
      

  13.   

    struts-config.xml文件中是不是没加入下边下边的代码:
    <plug-in
    className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation"
    value="/WEB-INF/applicationContext.xml" />
    </plug-in>
      

  14.   

    LoginAction在applicationContext.xml中的配置是否正确
      

  15.   

    单步调试一下,看result有没有取道值
      

  16.   

    将debug那行注释掉,再加上上面说的result!=null试试
      

  17.   


    确实struts-config.xml里面没有加这一句话,这个应该在哪个节点加?
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config>
      <form-beans >
        <form-bean name="loginForm" type="struts.form.LoginForm" />  </form-beans>
      <global-exceptions />
      <global-forwards />
      <action-mappings >
        <action
          attribute="loginForm"
          input="/login.jsp"
          name="loginForm"
          path="/login"
          scope="request"
          type="struts.action.LoginAction">
          <forward name="fail" path="/login.jsp" />
          <forward name="success" path="/index.jsp" />
        </action>  </action-mappings>  <message-resources parameter="struts.ApplicationResources" />
    </struts-config>
      

  18.   

    楼上的,明明就他的DAO 里的错误,没有找到对象的实力,空指针嘛!