liushunshun / memcache-client-forjava

Automatically exported from code.google.com/p/memcache-client-forjava
0 stars 0 forks source link

ContextObjectInputStream Caused by: java.lang.ClassNotFoundException: #25

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
您好,首先非常感谢您贡献的代码:
在我使用memcache-client-forjava作为Jetty 
Session实现的过程中,从memcache中取出保存的Session对象出现了�
��
Caused by: java.lang.ClassNotFoundException: 
org.springframework.security.ui.savedrequest.SavedRequest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604)
    at com.alisoft.xplatform.asf.cache.memcached.client.ContextObjectInputStream.resolveClass(ContextObjectInputStream.java:42)
发现是在ContextObjectInputStream中反向序列化对象时抛出的异常��
�

我的应用场景是,memcache-client-forjava在Jetty的启动中加载,用�
��实现Session的分布式缓存。
然后在Web应用中在Session中保存的对象,是在Web应用的ClassPath�
��的。

您的ContextObjectInputStream中默认处理流程:
        if ( mLoader == null )
            return super.resolveClass( v );
会抛出上面的异常。
我参考了一下Jetty的JdbcSession实现,他的处理流程是:
    try
    {
        return Class.forName(cl.getName(), false, Thread.currentThread().getContextClassLoader());
    }
    catch (ClassNotFoundException e)
    {
        return super.resolveClass(cl);
    }
根据Jetty的实现,尝试修改了您的ContextObjectInputStream.resolveClas
s方法,修改后:
    @SuppressWarnings("unchecked")
    protected Class resolveClass( ObjectStreamClass v ) throws IOException, ClassNotFoundException {
        if ( mLoader == null ) {
            try
            {
                return Class.forName(v.getName(), false, Thread.currentThread().getContextClassLoader());
            }
            catch (ClassNotFoundException e)
            {
                return super.resolveClass( v );
            }
        }
        else
            return Class.forName( v.getName(), true, mLoader );
    }
可以解决上述问题。表达的不好,不知是否明确。

Original issue reported on code.google.com by root.z...@gmail.com on 10 Aug 2010 at 10:53