我想用Gson反序列化我的Json String。但反序列化我的Json会引发以下错误:
无法为接口javax.faces.event.BehaviorListener调用no-args构造函数。使用Gson为此类型注册InstanceCreator可以解决此问题。
我已经使用Gson创建了String,因此应该有所有必要的数据。
我有一个包含几个不同字段的接口的LinkedHashmap。我已经编写了一个自定义序列化程序,我的json代码看起来没问题。我的两个子类使用AjaxBehavior(Listener),我认为这就是问题所在。
我尝试创建子类和AjaxBehavior的InstanceCreator,但两者都没有改变任何内容。
在下面:FormField是我的界面,formMap是我的LinkedHashmap,包含所有数据(工作)。反序列化后,formFields应该是formMap的克隆。当一切正常时,formMap将不存在,而formFields应该从外部Json填充。
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(FormField.class, new FormFieldDeserializer());
builder.registerTypeAdapter(FormField.class, new FormFieldSerializer());
builder.registerTypeAdapter(AjaxBehavior.class, new BehaviorListenerInstanceCreator());
builder.registerTypeAdapter(FormField.class, new CalendarInstanceCreator());
builder.setPrettyPrinting();
Gson gson = builder.create();
String myJson = gson.toJson(formMap);
System.out.println(myJson);
Type listType = new TypeToken<LinkedHashMap<String, FormField>>(){}.getType();
formFields = gson.fromJson(myJson, listType);
我的两个子类使用AjaxBehavior:
public class CalendarField extends FormField {
private AjaxBehavior ajax;
private void setupAjax() {
FacesContext context = FacesContext.getCurrentInstance();
ajax = (AjaxBehavior) context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajax.addAjaxBehaviorListener(new InputListener());
ajax.setTransient(true);
}
我试图为它制作一个InstanceCreator:
public class BehaviorListenerInstanceCreator implements InstanceCreator<AjaxBehavior> {
@Override
public AjaxBehavior createInstance(Type type) {
FacesContext context = FacesContext.getCurrentInstance();
AjaxBehavior ajax;
ajax = (AjaxBehavior) context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajax.addAjaxBehaviorListener(new InputListener());
ajax.setTransient(true);
return ajax;
}
}
我可以做什么,让我的对象回到LinkedHashmap?
我的JSON看起来像这样:
{
"MyCal": {
"type": "CalendarField",
"ajax": {
"listeners": [
{}
],
"transientFlag": true,
"initialState": false
},
"id": "MyCal",
"label": "Mein Datum",
"FromTo": false
},
"MyNumber": {
"type": "NumberField",
"IsYear": false,
"mask": "999?99",
"ajax": {
"listeners": [
{}
],
"transientFlag": true,
"initialState": false
},
"id": "MyNumber",
"label": "Eine Nummer",
"FromTo": false
},
....
答案 0 :(得分:0)
我找到了解决问题的方法。
我必须为AjaxBehavior而不是为BehaviorListener创建一个TypeAdapter
builder.registerTypeAdapter(BehaviorListener.class, new BehaviorListenerInstanceCreator());
在内部我返回一个InputListener对象(BehaviorListener的子类)。问题是他想创建一个BehaviorListener的对象,这是一个接口,所以他崩溃了。
public class BehaviorListenerInstanceCreator implements InstanceCreator<BehaviorListener> {
@Override
public BehaviorListener createInstance(Type type) {
InputListener ajax = new InputListener();
return ajax;
}
}
也许有人可以使用这些信息;)