Open
Description
问题描述
java.lang.NoClassDefFoundError: xxx/xxx/xxx/xxx/bean/response/BaseResponse$Error
at com.alibaba.fastjson2.reader.ORG_1_11_BaseResponse.readObject(Unknown Source)
at com.alibaba.fastjson2.JSON.parseObject(JSON.java:1534)
at com.xxx.xxx.xxx.xxx.JsonRpcUtils.decode(JsonRpcUtils.java:102)
at com.xxx.xxx.xxx.xxx.LspService.handleLspData(LspService.java:1364)
at com.xxx.xxx.xxx.xxx.LspService$3.onTextAvailable(LspService.java:1125)
at com.intellij.execution.process.ProcessHandler$2.onTextAvailable(ProcessHandler.java:289)
at com.intellij.execution.process.ProcessHandler.notifyTextAvailable(ProcessHandler.java:220)
at com.intellij.execution.process.BaseOSProcessHandler$SimpleOutputReader.onTextAvailable(BaseOSProcessHandler.java:133)
at com.intellij.util.io.BaseOutputReader.processInput(BaseOutputReader.java:213)
at com.intellij.util.io.BaseOutputReader.readAvailableBlocking(BaseOutputReader.java:151)
at com.intellij.util.io.BaseDataReader.readAvailable(BaseDataReader.java:72)
at com.intellij.util.io.BaseDataReader.doRun(BaseDataReader.java:153)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:218)
at com.intellij.util.io.BaseDataReader.lambda$start$0(BaseDataReader.java:48)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.ClassNotFoundException: xxx.xxx.xxx.xxx.xxx.xxx.BaseResponse$Error
at java.base/java.lang.ClassLoader.findClass(ClassLoader.java:723)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:592)
at com.alibaba.fastjson2.util.DynamicClassLoader.loadClass(DynamicClassLoader.java:190)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 23 more
环境信息
请填写以下信息:
- OS信息: windows 10
- JDK信息: JDK 17
- 版本信息:fastjson 2.0.57
重现步骤
问题场景同
#3420
上一个issue调用的方法
User user = Json.to(User.class, jsonStr);
现在出问题场景的调用方法是
User user = JSON.parseObject(jsonStr, User.class);
问题完整复现场景:
User.Java
package com.demo;
import com.alibaba.fastjson2.annotation.JSONField;
public class User {
@JSONField(name = "asss")
private String os;
private int age;
private Address address;
public String getOs() {
return os;
}
public void setOs(String name) {
this.os = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + os + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
Address.java
package com.demo;
public class Address {
private String addr;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "Address{" +
"addr='" + addr + '\'' +
'}';
}
}
Example.java
package com.demo;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Example {
public static void main(String[] args) throws ClassNotFoundException, IOException {
ExtClassLoader myClassLoader = new ExtClassLoader();
String jsonStr = "{\"name\": \"bobo\", \"age\": 15, \"address\": { \"addr\": \"demo address\" }}";
Class<?> userClass = myClassLoader.loadClass("com.demo.User");
// 以下代码正常
// JSONObject jsonObject = JSONObject.parseObject(jsonStr);
// Object user = JSON.to(userClass, jsonObject);
Object user = JSON.parseObject(jsonStr, userClass); // 出错代码片段
System.out.println(user);
}
public static class ExtClassLoader
extends ClassLoader {
public ExtClassLoader() throws IOException {
}
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
String path = "D:\\foo\\bar\\OtherModule"
+ File.separatorChar + name.replace('.', File.separatorChar) + ".class";
if (!Files.exists(Paths.get(path))) {
return super.findClass(name);
}
try {
byte[] bytes = Files.readAllBytes(Paths.get(path));
return defineClass(bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
throw new ClassNotFoundException();
}
}
}
}
期待的正确结果
可正常反序列化,不报错
相关日志输出
见前文问题描述
附加信息
无附加信息