无法从来自ElasticSearch的JSON反序列化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”调用的,包括认的构造函数

谢谢。

解决方法

反序列化时提供的类型是您示例中的接口,因此内部解析器(此处为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。