Open GoogleCodeExporter opened 9 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
root.z...@gmail.com
Original issue reported on code.google.com by
root.z...@gmail.com
on 10 Aug 2010 at 10:53