使用 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/