You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Fernando Cheros <fe...@cabezudo.net> on 2006/05/13 16:08:24 UTC

Tomcat, ClassLoader and java.lang.ClassCastException

I have this code:

DAOClassLoader d = new DAOClassLoader();
Object o = d.loadClass("security.to.ActionTO").newInstance();
System.out.println(o);
ActionTO u = (ActionTO)o;
u.setDescription("descripcion");
System.out.println(u);


The ActionTO is a simple TO object whit their get and sets and the
loadClass is:

package infraestructure.utils;

import java.io.FileInputStream;
import java.util.Hashtable;

public class DAOClassLoader extends ClassLoader {
    private Hashtable classes = new Hashtable();

    private byte getClassFromFile(String className)[] {
        System.out.println("Fetching the implementation of "
                + className);
        byte result[];
        try {
            String file =
"/home/esteban/workspace/security/web/WEB-INF/classes/"
                    + className;
            file = file.replaceAll("\\.", "/") + ".class";
            System.out.println("Trataremos con " + file + "...");
            FileInputStream fi = new FileInputStream(file);
            System.out.println("FileInputStream: " + fi);
            result = new byte[fi.available()];
            fi.read(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public Class loadClass(String className) throws ClassNotFoundException {
        return (loadClass(className, true));
    }

    @SuppressWarnings("unchecked")
    public synchronized Class loadClass(String className, boolean resolveIt)
            throws ClassNotFoundException {
        Class result;
        byte classData[];

        System.out.println("Load class : " + className);
        System.out.println("cache : ");

        /* Check our local cache of classes */
        result = (Class) classes.get(className);
        if (result != null) {
            System.out.println("returning cached result.");
            return result;
        }

        try {
            result = super.findSystemClass(className);
            System.out
                    .println("returning system class (in CLASSPATH).");
            return result;
        } catch (ClassNotFoundException e) {
            System.out.println("Not a system class.");
        }

        System.out.println("repositorio ");
        classData = getClassFromFile(className);
        if (classData == null) {
            throw new ClassNotFoundException();
        }

        /* Define it (parse the class file) */
        result = this.defineClass(null, classData, 0, classData.length);
        if (result == null) {
            throw new ClassFormatError();
        }

        if (resolveIt) {
            resolveClass(result);
        }

        classes.put(className, result);
        System.out.println("Returning newly loaded class.");
        return result;
    }
}



When I run the code in the console work fine, put when I run in a jsp I
have this:

type Exception report

message

description The server encountered an internal error () that prevented
it from fulfilling this request.

exception

org.apache.jasper.JasperException: security.to.ActionTO

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.ClassCastException: security.to.ActionTO
    security.administration.Authorization.<init>(Authorization.java:51)
    org.apache.jsp.admin.login_jsp._jspService(login_jsp.java:49)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache
Tomcat/5.0 logs.



and the log is:

2006-05-12 14:02:42 StandardWrapperValve[jsp]: Servlet.service() for
servlet jsp threw exception
java.lang.ClassCastException: security.to.ActionTO
        at
security.administration.Authorization.<init>(Authorization.java:46)
        at org.apache.jsp.admin.login_jsp._jspService(login_jsp.java:49)
        at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
        at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
        at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)



I configure tomcat with:

# Use the Java security manager? (yes/no)
TOMCAT5_SECURITY=no

to rule out the security system like a problem.
If I comment the code:

ActionTO u = (ActionTO)o;


work 'fine' (fine is like 'just run').
Anyone have any idea?
Thanks.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org