json - 无法从来自 ElasticSearch 的 JSON 反序列化 LifeRay 服务模型对象,未找到默认构造函数

标签 json elasticsearch serialization deserialization liferay

使用 LifeRay 门户和 ElasticSearch,序列化由 ServiceModel 对象组成的自定义对象,序列化很顺利:

public String toJSON(){
    return JSONFactoryUtil.looseSerializeDeep(this);
}
我将它索引到 ES 中也很好,它包含这些对象的列表以及单个对象,没问题。
当我反序列化这个我得到这个错误:
10:10:53,972 ERROR [ExceptionHandlerBridgeImpl:78] jodd.json.JsonException: Default ctor not found for: eu.project.drives.platform.model.model.TainingProvider
对于每个参数,它是来自服务模型的对象。
代码(也应该没问题,例如一个字段):
JSONObject obj = JSONFactoryUtil.createJSONObject(h.getSourceAsString());
                
                TainingProvider t = JSONFactoryUtil.looseDeserialize(obj.getString("provider"), TainingProvider.class);
我不能简单地引入 Default 构造函数,因为它是由服务构建器生成的,我也不能执行“TainingProviderImpl.class”,因为它是不同的项目,但 Impl 类应该是通过“TainingProvider.class”调用的,它包括默认值构造函数。
谢谢你。

最佳答案

进行反序列化时提供的类型是您示例中的接口(interface),因此内部解析器(此处为 Jodd)可能找不到用作 bean 类的实现类。
我没有找到好的解决方案,而是直接使用了内部的 Jodd 解析器。
当你继承 jodd.json.JsonParser您可以覆盖 protected 方法进行实例化。

@Override
protected Object newObjectInstance(Class targetType) {
    if (targetType.isAssignableFrom(TainingProvider.class)) {
        return TainingProviderLocalServiceUtil.createTainingProvider(0L);
    }
    return super.newObjectInstance(targetType);
}
现在您可以通过 parser.parse(obj.getString("provider"), TainingProvider.class) 直接使用解析器
我不确定是否可以将这个实例化提示 Hook 到 Liferays JSONFactoryUtil,这会更好,而不是直接依赖于模块中的 jodd Parser。

关于json - 无法从来自 ElasticSearch 的 JSON 反序列化 LifeRay 服务模型对象,未找到默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63411489/

相关文章:

java - 可选属性上的 @JsonFormat

java - Android PICASSO - 图像未加载到 ImageView + 停止发生以下所有语句

docker - Filebeat甚至没有成功将日志发送到Logstash

c# - 最快的 C# 序列化程序

serialization - 在同一源文件上使用不同 JDK 版本的编译器是否会破坏(反)序列化?

json - 如何在DRF中序列化一个对象的多个图像(如url中)?

json - Swift - 将类型动态传递给 JSONDecoder

jquery - 使用 Asp.net mvc 和 jQuery load() 将变量传递到 View

elasticsearch - Elasticsearch批量更新查询?

java - 将纪元以来的毫秒数转换为 1582 年之前的日历日期时出现问题