public class ContextListener implements HttpSessionListener {

private StudentBeanDao studentBeanDao;

public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = studentBeanDao;
} public void sessionCreated(HttpSessionEvent se) {


System.out.println("session创建:" + new java.util.Date());
} public void sessionDestroyed(HttpSessionEvent se) {

System.out.println("--------------sessionDestroyed------------");
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}

System.out.println("session销毁:" + new java.util.Date());


}
}
public class OnlineList implements HttpSessionAttributeListener {

private StudentBeanDao studentBeanDao;

private static int count = 0;

public void attributeAdded(HttpSessionBindingEvent se) {
count++;
System.out.println("--------attributeAdded------------");
System.out.println(count);
} public void attributeRemoved(HttpSessionBindingEvent se) {
count--;
System.out.println("--------attributeRemoved------------");
System.out.println(count); } public void attributeReplaced(HttpSessionBindingEvent se) {
} public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = studentBeanDao;
}

public static int getCount() {
return count;
}
}
公司有个需求是sessionDestroyed的时候删除登陆日志表里面的一条记录,不过此时会报一个空指针的错误java.lang.NullPointerException
at com.wiscom.jwxk.common.ContextListener.sessionDestroyed(ContextListener.java:42)
at org.apache.catalina.session.StandardSession.expire(StandardSession.java:702)
at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:592)
at org.apache.catalina.session.ManagerBase.processExpires(ManagerBase.java:680)
at org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:665)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1316)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Thread.java:619)
obj是可以获得准确的值的,所以应该不是取值问题     在线等   解决立马结账

解决方案 »

  1.   

    studentBeanDao.deleteStudentLog(obj.toString());为啥要obj.toString()啊
    你不是应该转为你要删的对象么???
      

  2.   


    参数是一个String类型的   这个是没问题的
      

  3.   

    是不是Object obj = se.getSession().getAttribute("userId");
    这里有问题呀,此时的session是不是已经被销毁了呀?但是我看api上说
    public void sessionDestroyed(HttpSessionEvent se)
    Notification that a session is about to be invalidated.
    不知道为啥!!!!!!!debug看下
      

  4.   

    object 获得了,那是哪个地方报空,总知道吧
      

  5.   

    那也就只是studentBeanDao为空了,是注入进来的么???
      

  6.   

    at com.wiscom.jwxk.common.ContextListener.sessionDestroyed(ContextListener.java:42)这个是哪一行?? 说的很清楚了, 空指针, 如果是dao那行就是没有正确注入。
      

  7.   


    studentBeanDao是注入进来的,没有问题,是类注册的地方有误,我用的是Spring MVC 
    这个监听器我注册在web.xml里面,Spring找不到这个类
      

  8.   

    Object obj = se.getSession().getAttribute("userId");
    if(obj!=null)
    {
    studentBeanDao.deleteStudentLog(obj.toString());
    }这里强转String 就可以了
    obj.toString() 可不等于String , 他打印的应该是一段地址
      

  9.   

    我们也用Spring MVC , Spring MVC + ibatis ,配置Servlet 的监听应该和 SpringMVC 的不一样,你找找吧,偶学习。。
      

  10.   

    studentBeanDao对象为空了吧
    看看是不是被手动清空了
      

  11.   


    那就是说deleteStudentLog里面出问题了吧~楼主跟过吗?
      

  12.   

    我发现问题可能是不是仅仅在web.xml里面注册监听器spring不识别呢?
      

  13.   


    在同一个控制类里,studentBeanDao在sessionDestroyed里面是空的
      

  14.   

    我觉得是事务的问题,你用studentBeanService封装studentBeanDao并应用事务,再看看.
      

  15.   


    我现在找到问题的关键是 studentBeanDao是null,注入失败我的注入bena是
    <bean id="contextListener" class="com.wiscom.jwxk.common.ContextListener">
    <property name="studentBeanDao" ref="studentBeanDaoImpl"/>
    </bean>在web.xml注册的监听器是
    <listener>
    <listener-class>com.wiscom.jwxk.common.ContextListener</listener-class>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>public class ContextListener implements HttpSessionListener { private StudentBeanDao studentBeanDao;
    private static int countOnlineList = 0; public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
    this.studentBeanDao = studentBeanDao;
    } public void sessionCreated(HttpSessionEvent se) {
    HttpSession session = se.getSession();
        session.setMaxInactiveInterval(60);
        synchronized (this) {
         countOnlineList++;
        }
        String id = session.getId();
        Date now = new Date();
        String message = new StringBuffer("New Session created on ").append(
            now.toString()).append("\nID: ").append(id).append("\n")
            .append("There are now ").append("" + countOnlineList).append(
                " live sessions in the application.").toString();     System.out.println(message);
        System.out.println("目前在线人数为:"+countOnlineList);
    }

    public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("--------------sessionDestroyed------------");
    Object obj = se.getSession().getAttribute("userId");
    if (obj != null) {
    studentBeanDao.deleteStudentLog(obj.toString());
    }
    // countOnlineList--;
    // System.out.println("目前在线人数为:"+countOnlineList);
    // System.out.println("session销毁:" + new java.util.Date());
    HttpSession session = se.getSession();
    //
        String id = session.getId();
        synchronized (this) {
          --countOnlineList;
        }
        String message = new StringBuffer("Session destroyed"
            + "\nValue of destroyed session ID is").append("" + id).append(
            "\n").append("There are now ").append("" + countOnlineList)
            .append(" live sessions in the application.").toString();
        System.out.println(message);
        System.out.println("目前在线人数为:"+countOnlineList);
        
    }}
      

  16.   

    你的监听器先于spring启动,所以取不到spring管理的bean studentBeanDao
    你用这个去取spring的ctx:
    ApplicationContext ctx = WebApplicationContextUtils
    .getRequiredWebApplicationContext(session.getServletContext());
    然后再取你的那个bean.
    试试吧,我没验证.