2013-01-01 2 views
6

Ho un paio di POJO che assomiglia a questo:Jackson serializzazione personalizzata in Spring 3 MVC

class Items { 
    List<Item> items; 

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

    ... 
} 

class Item { 
    String name; 
    Date insertionDate; 

    ... 
} 

io voglio essere in grado di serializzare il campo Date in Item utilizzando un formato personalizzato (aggiungere un prefisso al data, qualcosa come "Date: xxx"), ma non voglio farlo sempre (dato che viene utilizzato da altri utenti che non richiedono questo prefisso), solo in casi specifici.

Se io annotare Item s' getInsertionDate() con @JsonSerialize(using = CustomDateSerializer.class) io probabilmente può fare questo lavoro, tuttavia , non voglio farlo dal momento che non faccio sempre desidera serializzare questo campo con questo metodo, solo in un caso specifico.

Così idealmente, vorrei farlo in mio controller che non vuole personalizzare la serializzazione:

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

dove CustomDateSerializer extends SerializerBase<Date> e Jackson sarebbe capire che dovrebbe serializzare ogni elemento nella List utilizzando il serializzatore predefinito, e quando colpisce un oggetto Date, dovrebbe utilizzare il mio serializzatore personalizzato. Ovviamente questo non funziona poiché non è così che viene usato lo @JsonSerialize, ma c'è un modo per fare questo lavoro se non per avvolgere lo Item con un wrapper e usare quel wrapper quando voglio la serializzazione personalizzata? Sto pensando a questo nel modo sbagliato e c'è un altro modo per farlo?

Nota che sto utilizzando Spring MVC, quindi non sto chiamando direttamente la serializzazione.

Qualsiasi aiuto sarebbe molto apprezzato :)

risposta

2

Il problema è che Jackson non vede le annotazioni getItems() se è un metodo end point servizio; in genere viene passato solo il tipo List<Item> determinato da Spring. Con JAX-RS (come Jersey), tuttavia, vengono passate le annotazioni associate a quel metodo (e forse Spring ha anche un qualche modo); anche se quindi richiede un po 'più di supporto dal codice di integrazione (per JAX-RS, modulo JSON JSON-RS Jackson provider) per passare oltre.

Potrebbe essere più facile creare un POJO separato (e non passare i tipi List in modo da poter aggiungere le annotazioni necessarie.

Se si utilizza Jackson direttamente, è possibile utilizzare anche ObjectWriter e specificare il formato di data predefinito da utilizzare. Ma non so se Spring ti consenta di farlo (la maggior parte dei framework non mostra solo la configurabilità di ObjectMapper).

Una nota di più - invece di serializzatore personalizzato (e/o deserializzatore), è anche possibile utilizzare le annotazioni semplici con Date s (e su Jackson 2.x):

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

per specificare per-proprietà sovrascrittura del formato.

+0

una domanda: se creo un POJO separato invece di Elenco, posso annotarlo in qualche modo per applicare questa formattazione a tutte le date all'interno dell'elenco che contiene oppure devo annotare separatamente ogni oggetto Date? – TheZuck

+0

È possibile annotare la proprietà Elenco e deve essere applicata a tutte le date (ecc.) Contenute. – StaxMan

+0

Ci proverò quando passerò a 2.0+, attualmente 1.9.7 e 2.0+ non è ancora nel repository standard di Maven. Grazie per il tuo aiuto!! – TheZuck