2013-01-01 14 views
6

Ich habe ein paar von POJOs, die wie folgt aussieht:Jackson benutzerdefinierte Serialisierung unter Frühling 3 MVC

class Items { 
    List<Item> items; 

    public List<Item> getItems() { 
     return items; 
    } 

    ... 
} 

class Item { 
    String name; 
    Date insertionDate; 

    ... 
} 

Ich möchte das Date Feld serialisiert werden in der Lage sein in Item ein benutzerdefiniertes Format (fügen Sie ein Präfix der Datum, etwas wie "Datum: xxx"), aber ich möchte das nicht immer tun (wie es von anderen Verbrauchern verwendet wird, die dieses Präfix nicht benötigen), nur in bestimmten Fällen.

Wenn ich Item ‚s getInsertionDate() mit @JsonSerialize(using = CustomDateSerializer.class) mit Anmerkungen versehen kann ich wahrscheinlich diese Arbeit machen, jedoch, ich möchte nicht, dass tun, da ich nicht immer dieses Feld serialisiert wollen diese Methode verwenden, wird nur in einem bestimmten Fall.

So ideal, ich würde das tun in meinem Controller, der die Serialisierung anpassen will:

@JsonSerialize(using = CustomDateSerializer.class) 
public List<Item> getItems() { 
    .... 
} 

wo CustomDateSerializer extends SerializerBase<Date> und Jackson würde herausfinden, dass es in den List mit den Standard-Serializer jedes Element serialisiert werden sollte, und wenn es ein Date Objekt trifft, sollte es meinen benutzerdefinierten Serializer verwenden. Natürlich funktioniert das nicht, da @JsonSerialize nicht verwendet wird, aber gibt es eine Möglichkeit, diese Arbeit anders als Item mit einem Wrapper zu wickeln und diesen Wrapper zu verwenden, wenn ich die benutzerdefinierte Serialisierung möchte? Denk ich darüber falsch und es gibt einen anderen Weg, dies zu tun?

Beachten Sie, dass ich Spring MVC verwende, so dass ich die Serialisierung nicht direkt aufrufen.

Jede Hilfe wäre sehr geschätzt :)

Antwort

2

Das Problem ist, dass Jackson nicht die Anmerkungen auf getItems() sehen, ob es Verfahren ein Service-Endpunkt ist; Normalerweise wird nur Typ List<Item> von Spring bestimmt. Mit JAX-RS (wie Jersey) werden Anmerkungen, die mit dieser Methode verbunden sind, jedoch übergeben (und vielleicht hat Spring auch einen Weg); obwohl es dann etwas mehr Unterstützung von Integrationscode (für JAX-RS, Jackson JAX-RS JSON-Provider-Modul) benötigt, um dies weiterzugeben.

Es könnte einfacher sein, tatsächlich einen separaten POJO zu erstellen (und keine List Typen zu übergeben), so dass Sie notwendige Anmerkungen hinzufügen können.

Wenn Sie Jackson direkt verwenden, können Sie auch ObjectWriter verwenden und das zu verwendende Standarddatumsformat angeben. Aber ich weiß nicht, ob Spring das erlaubt (die meisten Frameworks nicht und nur die Konfigurierbarkeit von ObjectMapper).

Noch eine Anmerkung - anstelle von benutzerdefinierten Serializer (und/oder Deserializer), können Sie auch einfach Anmerkungen mit Date s verwenden können (und auf Jackson 2.x):

public class DateStuff { 
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="'Date:'yyyy'-'MM'-'dd") 
    public Date date; 
} 

pro-Eigenschaft angeben Format überschreiben.

+0

eine Frage: Wenn ich ein separates POJO anstelle von List erstelle, kann ich es irgendwie annotieren, um diese Formatierung auf alle Datumsangaben in der Liste anzuwenden, oder muss ich jedes Date-Objekt separat annotieren? – TheZuck

+0

Sie können die Listeneigenschaft mit Anmerkungen versehen und sie sollte auf alle enthaltenen Datumsangaben (usw.) angewendet werden. – StaxMan

+0

Ich werde es versuchen, wenn ich zu 2.0+, derzeit 1.9.7 und 2.0+ bewegt, ist nicht in der Standard-Maven-Repository noch. Danke für deine Hilfe!! – TheZuck

Verwandte Themen