2017-12-06 8 views
0

Ich möchte meine Json String mit Gson deserialisieren. Aber meine Json Deserialisieren wirft mir die folgenden Fehler:Gson deserialize LinkedHashmap mit geschachtelten Objekten

Unable to invoke no-args constructor for interface javax.faces.event.BehaviorListener. Registering an InstanceCreator with Gson for this type may fix this problem.

Ich habe die Zeichenfolge bereits mit Gson so sollte es alle sein, die notwendigen Daten.

Ich habe eine LinkedHashmap, die eine Schnittstelle von ein paar verschiedenen Feldern enthält. Ich habe bereits einen benutzerdefinierten Serializer geschrieben und mein JSON-Code sieht gut aus. Zwei meiner Unterklassen verwenden ein AjaxBehavior (Listener) und ich denke, das ist das Problem.

Ich habe versucht, einen InstanceCreator meiner Unterklassen und des AjaxBehavior zu erstellen, aber beide haben nichts geändert.

Im Folgenden: FormField ist meine Schnittstelle, formMap ist meine LinkedHashmap mit allen Daten (funktioniert). formFields sollte nach der Deserialisierung ein Klon von formMap sein. Wenn alles funktioniert, ist formMap nicht mehr da und formFields sollten von einem externen Json aus gefüllt werden.

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); 

Zwei meiner Unterklassen verwenden die 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); 
    } 

Und ich versuchte, eine InstanceCreator dafür zu machen:

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; 
    } 
} 

Was kann ich tun, meine Objekte zurück zu bekommen in die LinkedHashmap?

Meine JSON sieht wie folgt aus:

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

Antwort

0

ich eine Lösung für mein Problem gefunden.

Ich habe einen TypeAdapter nicht für AjaxBehavior zu schaffen, sondern für BehaviorListener

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

Und im Inneren ich ein Objekt von InputListener zurückkehren (Unterklasse von BehaviorListener). Das Problem war, dass er ein Objekt von BehaviorListener erstellen wollte, das eine Schnittstelle ist, also stürzte er ab.

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

     return ajax; 
    } 
} 

Vielleicht hat jemand diese Informationen benutzen kann;)

Verwandte Themen