如何解决无法从来自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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。