2011-01-12 5 views
5

Ho un progetto che utilizza Spring MVC per creare e gestire più endpoint REST. Attualmente sto lavorando sull'utilizzo di Jackson per gestire automaticamente la serializzazione/deserializzazione di JSON utilizzando le annotazioni @RequestBody e @ResponseBody.Come posso abilitare la custodia Pascal per impostazione predefinita quando si utilizza Jackson JSON in Spring MVC?

Ho lavorato a Jackson, quindi ho un punto di partenza. Il mio problema è che la nostra vecchia serializzazione è stata eseguita manualmente e ha utilizzato la custodia Pascal al posto della custodia Camel ("MyVariable" invece di "myVariable"), e Jackson ha la custodia Camel per impostazione predefinita.

So che posso modificare manualmente il nome di una variabile utilizzando @JsonProperty. Detto questo, non considero l'aggiunta di @JsonProperty a tutte le mie variabili per essere una valida soluzione a lungo termine.

C'è un modo per far sì che Jackson usi la custodia Pascal durante la serializzazione e la deserializzazione oltre all'uso dell'annotazione @JsonProperty?

MODIFICA: Sembra che non ci sia un modo pulito per farlo esternamente. Un paio di persone hanno suggerito di scavalcare classi diverse come un modo per raggiungere il mio obiettivo. Sono aperto a suggerimenti su ciò che posso ignorare che cambierà l'involucro. Al momento ho creato un ObjectMapper personalizzato che imposta alcune proprietà che desidero (ovvero Inclusion.NON_NULL). Non ho ancora trovato nessun posto che mi permettesse di cambiare il comportamento del rivestimento. qualche idea?

+0

Io non la penso così, Jackson sarà sempre utilizzerà il nome java in stile – skaffman

+0

a braccio, si può estendere la classe Jackson (i) e modificare la convenzione di denominazione in quel modo? – DwB

+0

È possibile eseguire l'override di alcuni pezzi (AnnotationIntrospector, BeanSerializerFactory) per farlo.Ma non esiste ancora un modo esteriore pulito per aggiungere strategie di denominazione (che è stata richiesta da più utenti) – StaxMan

risposta

1

Ho risolto il problema sovrascrivendo i (de) serializzatori. Per chi è interessato, ecco come farlo da soli:

Passo 1. Estendere BeanSerializerFactory.

Ignora il metodo _constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember). All'interno di questo metodo, modifica name in qualsiasi modo tu ritenga opportuno. Per implementare il rivestimento Pascal, ho usato questa linea: String formattedName = name.substring(0, 1).toUpperCase() + name.substring(1);. Dopo aver modificato name, chiamare super._constructWriter.

Passaggio 2. Estendere BeanDeserializationFactory.

Ignora il metodo constructSettableProperty(DeserializationConfig config, BasicBeanDescription beanDesc, String name, AnnotatedMethod setter). Fai la stessa cosa con il parametro name che hai fatto all'interno della tua personalizzata BeanSerializerFactory.

Passaggio 3. Creare uno ObjectMapper.

Impostare serializer factory come factory serializzatore bean personalizzata. Imposta il fornitore del deserializzatore (ho usato questa linea: objectMapper.setDeserializerProvider(new StdDeserializerProvider(new CustomJacksonBeanDeserializerFactory()))).

Questo è tutto. Lo ObjectMapper creato utilizzerà il nuovo schema di denominazione durante la serializzazione o deserializzazione di JSON.

0

Per quello che vale, c'è un Jira issue per supportare strategie collegabili; votare per questo potrebbe aiutare a convincere gli sviluppatori ad aggiungere supporto. Come ho detto nel commento, è possibile ignorare il comportamento interno, ma non è una cosa semplice da fare.

Problemi correlati