2010-06-25 22 views
8

Ich verwende derzeit Jackson 1.4.2 und versuche Deserialisierung von code Werte (eindeutige Bezeichner für Typinformationen), die von unserer Benutzeroberfläche zurück an die Java-Controller (Servlets) übergeben werden.Jackson erkennt @JsonCreator-Annotation nicht

Es gibt mehrere Typen (zB ABCType, XYZType, etc.), dass alle von einem AbstractType erstrecken, aber jeder konkreter Typ hat eine statische Factory-Methode, die als einzigen Parameter, eine eindeutige Kennung, und gibt das Typ-Objekt (Name, zugehörige Typen, Beschreibung, gültige Akronyme usw.), die durch diesen Identifikator repräsentiert werden. Die statische Methode in jedem konkreten Typ (zB XYZType) mit @JsonCreator kommentiert:

@JsonCreator 
public static XYZType getInstance(String code) { 
    ..... 
} 

Das Problem, das ich aber sehe eine Ausnahme von Jackson Mapper geworfen wird versucht, die json zu diesen Typen deserialisieren:

verursacht durch: org.codehaus.jackson.map.JsonMappingException: Kein Standardkonstruktor für type gefunden [einfacher Typ, Klasse com.company.type.XYZtype]: kann nicht vom Json-Objekt instanziiert werden.

Was ich hier der @JsonCreator Anmerkung zu statischen Factory-Methoden am fehlt (oder ist es mit Jackson zu tun 1.4.2 kämpfen mit den konkreten Typen der sich von einem AbstractType?)?

Antwort

12

Die Annotation @JsonCreator erfordert die Annotation @JsonProperty. Diese Jackson wiki page gibt wenig Informationen, aber nicht Beispielcode bieten:

@JsonCreator 
public Name(@JsonProperty("givenName") String g, @JsonProperty("familyName") String f) 
{ 
    givenName = g; 
    familyName = f; 
} 

Sie werden eine detailliertere Erklärung zu this blog post finden.

Ihr Beispielcode sollte daher wie folgt aussehen:

@JsonCreator 
public static XYZType getInstance(@JsonProperty("someCode") String code) 
{ 
... 
} 
4

Problem ist, dass Jackson nur den deklarierten Basistyp sieht und nicht weiß, wo nach Subtypen gesucht werden soll. Da die vollständige Handhabung des polymorphen Typs in 1.5 hinzugefügt wurde, müssen Sie mit der 1.4 die Factory-Methode in der Basisklasse hinzufügen und die Methoden von dort aus versenden.