-
Notifications
You must be signed in to change notification settings - Fork 6.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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: