Skip to content

[BUG]fastjson反序列化又出现NoClassDefFoundError #3478

Open
@ifreefly

Description

@ifreefly

问题描述

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();
            }
        }
    }
}

期待的正确结果

可正常反序列化,不报错

相关日志输出

见前文问题描述

附加信息

无附加信息

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions