-
Notifications
You must be signed in to change notification settings - Fork 6.5k
java.lang.ClassNotFoundException: com.alibaba.fastjson.serializer.SerializeFilterable #616
Comments
有点绕哦,能否帮我做一个重现问题的testcase?另外怀疑同时存在两个版本的fastjson fastjson有专门处理这样问题代码的,不知道为啥不起作用,你能否帮忙在你的环境调试一下 // com.alibaba.fastjson.util.ASMClassLoader.isExternalClass
public boolean isExternalClass(Class<?> clazz) {
ClassLoader classLoader = clazz.getClassLoader();
if (classLoader == null) {
return false;
}
ClassLoader current = this;
while (current != null) {
if (current == classLoader) {
return false;
}
current = current.getParent();
}
return true;
} |
是有两个版本fastjson,使用独立的ClassLoader就是为了避免版本冲突,刚才试了下,去掉另外一个fastjson的依赖,没有这个异常,所以应该还是classloader的逻辑有问题 |
跟踪了下,这个isExternalClass跟报的异常MS没什么关系,这个isExternalClass被调用时的现场: 第一行是触发ASMClassLoader.isExternalClass调用时,ASMClassLoader的classloader以及它的parent; |
om.alibaba.fastjson.util.ASMClassLoader@1cea9777 => java.net.URLClassLoader@3fa1732d!!!sun.misc.Launcher$AppClassLoader@4aa0560e 挺诡异的结果,第一行是调用 isExternalClass 时, 在两次调用之间有修改过 ASMClassLoader@1cea9777 的parent? |
这个改不了的吧,很诡异哦,另问1.2.8有问题么? |
刚才的评论有问题,我已经在原来的评论上编辑了下,这个问题主要是跟 ASMClassLoader 的 getParentClassLoader的逻辑有关,当 Thread.currentThread().getContextClassLoader() 能加载到JSON这个类,但跟ASMClassLoader 本身不在一个版本的包里时,就会出问题。 具体到我这个场景: 所以我觉得getParentClassLoader逻辑需要调整一下, Update:看了下ASMClassLoader的更改历史,MS之前为了修复什么bug由直接用ASMClassLoader的classloader改成了目前这种形式 |
先用这样办法解决吧 ParserConfig.global = new ParserConfig(ClassLoader); 也希望你能帮忙想办法 |
这个没啥用,这个可能改变ASMDeserializerFactory的ASMClassLoader,对ASMSerializerFactory不起作用,
里直接new了ASMClassLoader |
顺便问一下,1d423d2 这个提交在修正什么问题? |
我重现了问题,修改了ASMSerializerFactory的classloader,你帮忙验证一下? |
在我的场景下试了下最新的提交,工作正常 |
那我关闭了issue了啊,等发布吧,预计这个月底或者6月初发布 |
java.lang.ClassNotFoundException: com.alibaba.fastjson.serializer.SerializeFilterable
java.lang.ClassLoader.findClass(ClassLoader.java:531)
java.lang.ClassLoader.loadClass(ClassLoader.java:425)
java.lang.ClassLoader.loadClass(ClassLoader.java:358)
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Class.java:2532)
java.lang.Class.getConstructor0(Class.java:2842)
java.lang.Class.newInstance(Class.java:345)
com.alibaba.fastjson.serializer.ASMSerializerFactory.createJavaBeanSerializer(ASMSerializerFactory.java:438)
com.alibaba.fastjson.serializer.SerializeConfig.createASMSerializer(SerializeConfig.java:99)
com.alibaba.fastjson.serializer.SerializeConfig.createJavaBeanSerializer(SerializeConfig.java:137)
com.alibaba.fastjson.serializer.SerializeConfig.getObjectWriter(SerializeConfig.java:425)
com.alibaba.fastjson.serializer.JSONSerializer.getObjectWriter(JSONSerializer.java:320)
com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:263)
com.alibaba.fastjson.JSON.toJSONString(JSON.java:562)
com.alibaba.fastjson.JSON.toJSONString(JSON.java:504)
com.alibaba.fastjson.JSON.toJSONString(JSON.java:469)
场景:fastjson由一个URLClassLoader加载,这个ClassLoader的parent是SystemClassLoader。
在由SystemClassLoader加的类A中通过反射生成URLClassLoader加载的一个类B并生成一个对象b,然后调用该对象b的一个接口,这个接口内部调用 JSON.toJSONString。
版本:1.2.11
The text was updated successfully, but these errors were encountered: