2017-12-06 3 views
0

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 
    }, 
.... 

답변

0

나는 내 문제에 대한 해결책을 발견했다.

나는하지 AjaxBehavior뿐만 BehaviorListener

builder.registerTypeAdapter(BehaviorListener.class, new BehaviorListenerInstanceCreator()); 

에 내가 InputListener의 대상 (BehaviorListener의 서브 클래스)을 반환 내부 TypeAdapter을 만들어야합니다. 문제는 인터페이스 인 BehaviorListener의 객체를 만들고 싶었 기 때문에 추락했습니다.

public class BehaviorListenerInstanceCreator implements InstanceCreator<BehaviorListener> { 
    @Override 
    public BehaviorListener createInstance(Type type) { 
     InputListener ajax = new InputListener(); 

     return ajax; 
    } 
} 

어쩌면이 정보를 사용할 수있는 사람)

관련 문제