# ClassCastException aber warum?



## Guest (25. Apr 2005)

folgender Code: 


```
import org.apache.struts.action.*;
import javax.servlet.http.*;
import javax.servlet.*;
import de.axa.sso.SSOHandler;
import java.io.*;
import java.util.*;

public class GetResultServlet extends HttpServlet
{
  public void service(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException
  {
    res.setContentType("text/html");
    ServletOutputStream  out = res.getOutputStream();
    out.println("<html>");
    out.println("<head>");

    String title = "GetResultServlet";
    out.println("<title>" + title + "</title>");
    out.println("</head>");
    out.println("<body bgcolor=\"white\">");
    out.println("<h1>" + title + "</h1>");

    ServletContext sc = getServletContext();
    ServletContext tc = sc.getContext("/SSO-Master");

    String test = "";
    Object o = null;
    String result = "";

    if(tc!=null)
    {
      Enumeration e = tc.getAttributeNames();
      while(e.hasMoreElements())
        test += (String)e.nextElement() + ", ";

      o = tc.getAttribute("SSOHandler");
    }
    else
      test="tc=null";

    SSOHandler ssohandler = null;

    try
    {
      System.out.println("name..................: " + o.getClass().getName());
      ssohandler = (SSOHandler) o;
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }
```

letzere also   ssohandler = (SSOHandler) o; schmeisst mir immer die ClassCastException, obwohl ich o mit ClassName die richtige Class habe (also SSOHandler) und per Debug auch sehen konnte, dass es um die Klasse handelt.
Habt Ihr einen Tip?


----------



## Bleiglanz (25. Apr 2005)

FullName?

teste lieber mit instanceof...


----------



## Guest (25. Apr 2005)

was heisst FullName?
Mit instance of krieg ich false, das ist ja das seltsame...


----------



## Guest (25. Apr 2005)

wenn du kompletten pacckage pfad meinst, ja gibt er mit mit classname aus...


----------



## Bleiglanz (25. Apr 2005)

sorry, war Fullname war käse

ist das die Situation:

```
o.getName().equals("de.axa.sso.SSOHandler") // ==true

(o instanceof de.axa.sso.SSOHandler) // ==false
```

kann eigentlich nicht sein, es sein denn es sind ganz schräge classloading probleme am werk, welche Servlet-Engine hast du denn am laufen...?


----------



## Guest (25. Apr 2005)

ja genau diese situation. ich hab den tomcat 4.1. 

wie kann ich class-loading probleme denn feststellen?


----------



## Bleiglanz (25. Apr 2005)

oops, hab deinen code gerade mal angeschaut

du willst ja "contextübergreifend" arbeiten


```
ServletContext sc = getServletContext();
    ServletContext tc = sc.getContext("/SSO-Master");
```

und der SSO-Master Context hat wahrscheinlich einen eigenen Classloader...

warum überschreibst du in einem HttpServlet die Service Methode, das ist schon mal schräg...

bist du sicher dass das so geht, ich glaubs ja nicht...? 

offenbar gehts um Singe-Sign-On, frag mal den Autor von SSOHandler wie er sich das vorstellt...


----------



## Guest (25. Apr 2005)

genau das ist der punkt. man kann den tomcat so konfigurieren. d.h. ein parameter 

crossContext="true" 

setzen. genau single sign on. ich hab 2 anwendungen (master und slave) master schreibt ein cookie und schreibt den ssohandler in den kontext. slave anwendung holt sich den cookie und überprüft den mittels den im context enthaltenen ssohandler.

ich brauch den autor nicht zu fragen, bin der selber 

woran kann es sonst liegen ? wie gesagt, kontexte kann man über den parameter anwendungsübergreifend holen


----------



## Bleiglanz (25. Apr 2005)

ja, aber jede webapp hat i.A. einen eigenen Classloader, so dass die Klasse

de.axa.sso.SSOHandler

in webapp1 eine andere ist als in webapp2....


----------



## Guest (25. Apr 2005)

wozu gibt es dann cross-context ?


----------



## Bleiglanz (26. Apr 2005)

dazu nicht!

legs in common/lib und verwalte das Ding über den JNDI Baum


----------

