【问题标题】:Cannot Deserialize LifeRay Service Model Object from JSON that came from ElasticSearch, Default Constructor not Found无法从来自 ElasticSearch 的 JSON 反序列化 LifeRay 服务模型对象,未找到默认构造函数
【发布时间】:2020-08-14 11:00:15
【问题描述】:

使用 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”调用的,它包括默认构造函数。

谢谢。

【问题讨论】:

    标签: json elasticsearch serialization deserialization liferay


    【解决方案1】:

    在您的示例中进行反序列化时提供的类型是一个接口,因此内部 Parser(此处为 Jodd)可能找不到用作 bean 类的实现类。

    我没有找到好的解决方案,而是直接使用了内部的 Jodd 解析器。 当您继承 jodd.json.JsonParser 时,您可以覆盖受保护的方法以进行实例化。

    @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)直接使用解析器

    我不确定是否可以将这个实例化提示挂钩到 Liferays JSONFactoryUtil,这样会更好,而不是直接依赖于模块中的 jodd Parser。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2019-05-08
      • 2013-11-05
      • 1970-01-01
      • 2016-10-29
      • 2021-06-07
      • 2022-01-05
      相关资源
      最近更新 更多