[BUG]fastjson反序列化又出现NoClassDefFoundError
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
```java
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
### 重现步骤
问题场景同
https://github.com/alibaba/fastjson2/issues/3420
上一个issue调用的方法
```java
User user = Json.to(User.class, jsonStr);
```
现在出问题场景的调用方法是
```java
User user = JSON.parseObject(jsonStr, User.class);
```
问题完整复现场景:
User.Java
```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
```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
```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();
}
}
}
}
```
### 期待的正确结果
可正常反序列化,不报错
### 相关日志输出
见前文问题描述
#### 附加信息
无附加信息
Contributor guide
Research direction
Start with the provided Example.java reproduction and compare JSON.parseObject(jsonStr, userClass) with the working JSON.to path. Inspect the JSON.parseObject stack entry and DynamicClassLoader loading behavior; done means the supplied User and Address classes deserialize normally without NoClassDefFoundError.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100