alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.74k stars 484 forks source link

[QUESTION]序列化对象的构造函数问题 #1486

Open TsukasaHwan opened 1 year ago

TsukasaHwan commented 1 year ago

请描述您的问题

序列化对象的构造函数包含不存在的类会报ClassNotFound,比如说我封装了一个通用jar和通用对象,但是这个通用jar中的通用对象构造函数依赖了一个<optional>true</optional>的类库,序列化时报NoClassDefFoundError,使用时没有用这个包含不存在类的构造函数,请问一下有何方法避免NoClassDefFoundError

wenshao commented 1 year ago

能提供报错信息么?

TsukasaHwan commented 1 year ago

能提供报错信息么?

Exception in thread "main" java.lang.NoClassDefFoundError: org/elasticsearch/search/SearchHits at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetPublicMethods(Class.java:2902) at java.lang.Class.getMethods(Class.java:1615) at com.alibaba.fastjson2.util.BeanUtils.getters(BeanUtils.java:923) at com.alibaba.fastjson2.writer.ObjectWriterCreatorASM.createObjectWriter(ObjectWriterCreatorASM.java:256) at com.alibaba.fastjson2.writer.ObjectWriterProvider.getObjectWriter(ObjectWriterProvider.java:369) at com.alibaba.fastjson2.JSON.toJSONString(JSON.java:2673) at com.dangyang.mini.service.impl.OrderServiceImpl.main(OrderServiceImpl.java:476) Caused by: java.lang.ClassNotFoundException: org.elasticsearch.search.SearchHits at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 9 more

不存在的类为SearchHits,感觉是不可避免的,因为调用了getDeclaredMethods

private QueryResult(Query query, SearchHits searchHits, Class<T> clazz) {
    List<T> records = new ArrayList<>(searchHits.getHits().length);
    searchHits.forEach(documentFields -> records.add(JSON.parseObject(documentFields.getSourceAsString(), clazz)));
    this.records = records;
    this.current = query.getCurrent();
    this.size = query.getSize();
    this.total = searchHits.getTotalHits().value;
    this.pages = this.total % this.size == 0 ? (this.total / this.size) : (this.total / this.size + 1);
}
wenshao commented 1 year ago

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.33-SNAPSHOT/ 问题已修复,请帮忙用2.0.33-SNAPSHOT版本验证。

TsukasaHwan commented 1 year ago

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.33-SNAPSHOT/ 问题已修复,请帮忙用2.0.33-SNAPSHOT版本验证。

不得行,序列化的时候出现的是空json对象

public static void main(String[] args) {
    Query query = new Query();
    query.setSize(10);
    query.setCurrent(1);
    QueryResult<Object> objectQueryResult = QueryResult.newEmptyQueryResult(query);
    objectQueryResult.setRecords(Collections.singletonList(1));
    String s = JSON.toJSONString(objectQueryResult);
    System.out.println(s);
}

输出为{} 去掉参数有不存在的类的构造函数就是正确的 {"current":1,"pages":0,"records":[1],"size":10,"total":0}

z744489075 commented 1 year ago

我也遇到了同样的问题. 当类是通过 URLClassLoader 加载进来的. java.util.concurrent.CompletionException: java.lang.NoClassDefFoundError: com/maishi/mqtt/bean/ChildDeviceOtherEventVos at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315) at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1770) 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.lang.Thread.run(Thread.java:833) Caused by: java.lang.NoClassDefFoundError: com/maishi/mqtt/bean/ChildDeviceOtherEventVos at com.alibaba.fastjson2.reader.ORG_15_5_ChildDeviceOtherEventVos.createInstance(Unknown Source) at com.alibaba.fastjson2.reader.ObjectReaderAdapter.createInstance(ObjectReaderAdapter.java:582) at com.alibaba.fastjson.JSONObject.toJavaObject(JSONObject.java:1011) at com.maishi.mqtt.FbeeMqttDeviceUpServiceImpl.childDeviceOtherEvent(FbeeMqttDeviceUpServiceImpl.java:146) at com.maishi.mqtt.FbeeMqttDeviceUpServiceImpl.handleMessage(FbeeMqttDeviceUpServiceImpl.java:116) at com.maishi.d.a.a.g(KafkaMqttGatewayConsumer.java:101) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ... 3 common frames omitted Caused by: java.lang.ClassNotFoundException: com.maishi.mqtt.bean.ChildDeviceOtherEventVos at java.base/java.lang.ClassLoader.findClass(ClassLoader.java:718) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587) at com.alibaba.fastjson2.util.DynamicClassLoader.loadClass(DynamicClassLoader.java:190) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 10 common frames omitted

1.x是没有这个问题的

这个对象通过 ChildDeviceOtherEventVos c=new ChildDeviceOtherEventVos() 是可以实例化的