2013-01-01 18 views
6

Mam parę POJOs który wygląda tak:Jackson niestandardowy serializacji pod Spring 3 MVC

class Items { 
    List<Item> items; 

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

    ... 
} 

class Item { 
    String name; 
    Date insertionDate; 

    ... 
} 

Chcę móc pole Date do serializacji w Item stosując format niestandardowy (dodaj prefiks do data, np. "Data: xxx"), ale nie chcę tego robić zawsze (ponieważ jest używana przez innych użytkowników, którzy nie wymagają tego prefiksu), tylko w określonych przypadkach.

Gdybym opisywanie Item „s getInsertionDate() z @JsonSerialize(using = CustomDateSerializer.class) mogę prawdopodobnie uczynić tę pracę, jednak, nie chcę tego robić, ponieważ nie zawsze chcą to pole do serializacji przy użyciu tej metody, tylko w konkretnym przypadku.

Tak idealnie, że byłoby to zrobić w moim kontrolera, który chce, aby dostosować serializacji:

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

gdzie CustomDateSerializer extends SerializerBase<Date> i Jackson by zorientować się, że powinna ona szeregować każdą pozycję w List użyciu domyślnego serializatora, a kiedy uderzy w obiekt Date, powinien użyć mojego niestandardowego serializera. Oczywiście to nie działa, ponieważ nie jest to sposób, w jaki jest używane @JsonSerialize, ale czy istnieje sposób, aby uczynić tę pracę inną niż owijanie Item i używanie tego opakowania, gdy chcę niestandardową serializację? Czy myślę o tym w niewłaściwy sposób i jest inny sposób na zrobienie tego?

Należy pamiętać, że używam Spring MVC, więc nie wywołuję bezpośrednio serializacji.

Każda pomoc będzie mile widziane :)

Odpowiedz

2

Problem polega na tym, że Jackson nie widzi adnotacje dotyczące getItems() jeśli jest to metoda punktu końcowego usługi; typowo jest przekazywany tylko typ List<Item>, który określa Spring. W przypadku JAX-RS (np. Jersey), adnotacje związane z tą metodą są jednak przekazywane (i być może Spring również ma jakiś sposób); chociaż wymaga to nieco więcej wsparcia z kodu integracji (dla JAX-RS, modułu JAX-JSON dostawcy Jackson), aby przekazać to dalej.

Utworzenie oddzielnego obiektu POJO (i nieprzeznaczenie typów List) może być łatwiejsze, aby można było dodawać niezbędne adnotacje.

Jeśli używasz bezpośrednio Jacksona, możesz również użyć ObjectWriter i określić domyślny format daty do użycia. Ale nie wiem, czy Spring pozwala to zrobić (większość frameworków nie ma i tylko wystawia konfigurowalność ObjectMapper).

Jeszcze jedna uwaga - zamiast serializatora niestandardowego (i/lub Deserializatora), można również wykorzystać proste adnotacje z Date s (i na Jackson 2.x):

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

określenia per-nieruchomości nadpisanie formatu.

+0

jedno pytanie: jeśli utworzę oddzielne POJO zamiast listy, czy mogę je opisać w jakiś sposób, aby zastosować to formatowanie do wszystkich dat na liście, która jest przechowywana, czy też muszę osobno opisywać każdy obiekt Date? – TheZuck

+0

Można opisywać właściwości listy i powinno to dotyczyć wszystkich dat (itp.) Zawartych. – StaxMan

+0

Spróbuję, gdy przejdę do wersji 2.0+, obecnie na poziomie 1.9.7 i 2.0+ nie ma jeszcze standardowego repozytorium maven. Dzięki za pomoc! – TheZuck

Powiązane problemy