各位大牛,来看看看这个异常吧。代码背景:
这是两个项目的整合,在A项目中用session set了一个对象,然后将其封装到一个servletContext中,代码如下:
HttpSession session = request.getSession(true);
session.setAttribute(Constant.USER_SESSION, user);
ServletContext context=session.getServletContext();
context.setAttribute("session", session);然后在B项目中获取这个user对象,代码如下:
HttpSession session=request.getSession();
ServletContext Context=session.getServletContext();
ServletContext Context1=Context.getContext("/A");
if(Context1 !=null && !Context1.equals("")){
HttpSession sess =(HttpSession)Context1.getAttribute("session");
User user=(User)sess.getAttribute(Constant.USER_SESSION);
if(user!=null)
System.out.println("username:--------"+user.getUserName());
}
然后抛出一个类型转换异常:
java.lang.ClassCastException: com.nodoor.vo.User cannot be cast to com.nodoor.vo.User
我这样测试了下:System.out.println(sess.getAttribute(Constant.USER_SESSION) instanceof User)
结果竟然是false....求解。
诡异的异常。纠结我一天了。。求解脱。

解决方案 »

  1.   

    两个项目是不是应该公用一个user?
      

  2.   


    其实不是公用一个user...分别查询的。我觉得是这个session机制的问题。求大牛解脱。。
      

  3.   

    User在另外一个项目中使用时,包名 也必须跟session中存的那个 User一样,否则也会被认为两个User是不同的对象。
      

  4.   

    不同的ServletContext的实例也是不同的....建议楼主将传对象改为传基本类型数组,过来再封装对象。
      

  5.   


    您能说清楚点吗?System.out.print(session.getAttribute(Constant.USER_SESSION).getClass());我这样打印出来的结果是:com.nodoor.vo.User而User本身这个类就是com.nodoor.vo.User而抛出的异常也是:Unhandled Exception thrown: class java.lang.ClassCastException
    org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.ClassCastException: com.nodoor.vo.User cannot be cast to com.nodoor.vo.User
    at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:502)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:412)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    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 cn.jsprun.filter.FileCaptureFilter.doFilter(FileCaptureFilter.java:43)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at cn.jsprun.filter.OnlineFilter.doFilter(OnlineFilter.java:191)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at cn.jsprun.filter.GZIPFilter.doFilter(GZIPFilter.java:33)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at cn.jsprun.filter.EncodingFilter.doFilter(EncodingFilter.java:26)
    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:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)
    Caused by: javax.servlet.ServletException: java.lang.ClassCastException: com.nodoor.vo.User cannot be cast to com.nodoor.vo.User
    at org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:237)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    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 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709)
    at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680)
    at org.apache.jsp.nodoor_jsp._jspService(nodoor_jsp.java:56)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
    ... 27 more
    Caused by: java.lang.ClassCastException: com.nodoor.vo.User cannot be cast to com.nodoor.vo.User
    at cn.jsprun.struts.foreg.actions.NodoorManageAction.nodoorLogin(NodoorManageAction.java:31)
    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)
    ... 44 more求解。。
      

  6.   


    你说不同的ServletContext的实例也是不同的,但我测试了一个例子,就是A,B两个项目,有两个简单的页面,在A页面用上面的方法,先用session.set...然后再把session放到servletContext中去,在B项目中的B页面中可以获取到A项目中A页面用session.set进来的值,然后你说可能是类型的原因,但我set一个String ,一个Date,都是可以获取到值的。
    或许你说的基本类型还真可能可行,然后,我先试试吧。 还是非常谢谢您的解答。