Gson으로 내 Json String을 deserialize하고 싶습니다. 하지만 내 JSON을 역 직렬화하는 것은 나에게 다음과 같은 오류가 발생합니다 : 필요한 모든 데이터가 있어야하므로Gson은 중첩 된 객체로 LinkedHashmap을 비 직렬화합니다.
Unable to invoke no-args constructor for interface javax.faces.event.BehaviorListener. Registering an InstanceCreator with Gson for this type may fix this problem.
나는 GSON로 이미 문자열을 만들었습니다.
저는 몇 가지 필드의 인터페이스를 포함하는 LinkedHashmap을 가지고 있습니다. 나는 이미 커스텀 시리얼 라이저를 작성했고 json 코드는 괜찮아 보인다. 두 개의 하위 클래스에서 AjaxBehavior (Listener)를 사용하고 이것이 문제라고 생각합니다.
내 하위 클래스와 AjaxBehavior의 InstanceCreator를 만들려고했지만 두 가지 모두 변경되지 않았습니다.
다음은 FormField가 내 인터페이스이고 formMap이 모든 데이터 (작동 중)를 사용하는 LinkedHashmap입니다. deserialization이 작동 한 후에 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
},
....