2011-01-12 6 views
5

Mam projekt, który używa Spring MVC do tworzenia i obsługi wielu punktów końcowych REST. Obecnie pracuję nad wykorzystaniem Jacksona do automatycznej obsługi seralizacji/deserializacji JSON przy użyciu adnotacji @RequestBody i @ResponseBody.Jak mogę domyślnie włączyć obudowę Pascala podczas używania Jackson JSON w Spring MVC?

Dostałem pracę Jacksona, więc mam punkt wyjścia. Mój problem polega na tym, że nasza stara serializacja została wykonana ręcznie i wykorzystała obudowę Pascala zamiast obudowy Camel ("MyVariable" zamiast "myVariable"), a Jackson domyślnie obsługuje obudowę Camel.

Wiem, że mogę ręcznie zmienić nazwę zmiennej za pomocą @JsonProperty. Biorąc to pod uwagę, nie uważam dodawania @JsonProperty do wszystkich moich zmiennych za opłacalne długoterminowe rozwiązanie.

Czy istnieje sposób, aby Jackson używał obudowy Pascala podczas serializowania i deserializacji innej niż przy użyciu adnotacji @JsonProperty?

EDYCJA: Wygląda na to, że nie ma na to sposobu na zewnątrz. Kilka osób zasugerowało pominięcie różnych klas jako sposobu na osiągnięcie mojego celu. Jestem otwarty na sugestie dotyczące tego, co mogę zmienić, co zmieni obudowę. W tej chwili stworzyłem niestandardową ObjectMapper, która ustawia pewne właściwości, które chcę (mianowicie Inclusion.NON_NULL). Nie znalazłem jeszcze miejsca, które pozwoliłoby mi zmienić zachowanie obudowy. jakieś pomysły?

+0

Nie sądzę, że Jackson będzie zawsze używał nazwy w stylu java. – skaffman

+0

. Czy poza mankietem możesz rozszerzyć klasę Jackson'a i zmienić konwencję nazewnictwa w ten sposób? – DwB

+0

Możesz zastąpić niektóre elementy (AnnotationIntrospector, BeanSerializerFactory), aby to zrobić.Ale nie ma jeszcze czystej, zewnętrznej metody dodawania strategii nazewnictwa (wymaganej przez wielu użytkowników) – StaxMan

Odpowiedz

1

Skończyło się na rozwiązaniu problemu przez przesłonięcie (de) serializerów. Osoby zainteresowane mogą wykonać to samodzielnie:

Krok 1. Przedłużenie BeanSerializerFactory.

Zastąp metodę _constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember). Wewnątrz tej metody zmodyfikuj name w dowolny sposób, jaki uznasz za stosowny. Aby zaimplementować obudowę Pascala, użyłem tej linii: String formattedName = name.substring(0, 1).toUpperCase() + name.substring(1);. Po zmodyfikowaniu name, zadzwoń pod numer super._constructWriter.

Krok 2. Przedłużenie BeanDeserializationFactory.

Zastąp metodę constructSettableProperty(DeserializationConfig config, BasicBeanDescription beanDesc, String name, AnnotatedMethod setter). Zrób to samo z parametrem name, który zrobiłeś wewnątrz niestandardowego BeanSerializerFactory.

Krok 3. Utwórz ObjectMapper.

Ustaw fabrykę serializatorów na fabrykę niestandardowych serializatorów fasoli. Ustaw dostawcę deserializera (użyłem tego wiersza: objectMapper.setDeserializerProvider(new StdDeserializerProvider(new CustomJacksonBeanDeserializerFactory()))).

To wszystko. Utworzony ObjectMapper użyje nowego schematu nazewnictwa podczas serializowania lub deserializacji JSON.

0

Co jest warte, istnieje Jira issue do obsługi strategii wtykowych; głosowanie za nią może pomóc przekonać programistów do dodania wsparcia. Jak wspomniałem w komentarzu, możliwe jest zastąpienie wewnętrznego zachowania, ale nie jest to proste.

Powiązane problemy