问题描述
使用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。