2011-01-12 5 views
5

Ich habe ein Projekt, das Spring MVC verwendet, um mehrere REST-Endpunkte zu erstellen und zu verarbeiten. Ich arbeite derzeit daran, Jackson zu verwenden, um die Seralisierung/Deserialisierung von JSON mithilfe der @RequestBody und @ResponseBody Annotationen automatisch zu behandeln.Wie kann ich Pascal Gehäuse standardmäßig aktivieren, wenn Jackson JSON in Spring MVC verwendet wird?

Ich habe Jackson arbeiten, also habe ich einen Ausgangspunkt. Mein Problem ist, dass unsere alte Serialisierung manuell gemacht wurde und Pascal-Gehäuse anstelle von Camel-Gehäuse ("MyVariable" anstelle von "myVariable") verwendet wurde und Jackson standardmäßig Camel-Gehäuse verwendet.

Ich weiß, dass ich den Namen für eine Variable mit @JsonProperty manuell ändern kann. Nichtsdestotrotz denke ich nicht, dass ich allen meinen Variablen @JsonProperty hinzufügen werde, um eine brauchbare langfristige Lösung zu sein.

Gibt es eine Möglichkeit, Jackson Pascal Gehäuse beim Serialisieren und Deserialisieren anders als die Verwendung der @JsonProperty Annotation zu machen?

EDIT: Es sieht so aus, als gäbe es keinen sauberen Weg, dies extern zu tun. Ein paar Leute haben vorgeschlagen, verschiedene Klassen zu überschreiben, um mein Ziel zu erreichen. Ich bin offen für Vorschläge, was ich außer Kraft setzen kann, um das Gehäuse zu ändern. Im Moment habe ich einen benutzerdefinierten ObjectMapper gemacht, der einige Eigenschaften setzt, die ich will (nämlich Inclusion.NON_NULL). Ich habe noch keinen Ort gefunden, an dem ich das Gehäuseverhalten ändern könnte. Irgendwelche Gedanken?

+0

Ich denke nicht, Jackson wird immer den Java-Namen verwenden – skaffman

+0

Aus dem Stegreif, können Sie die Jackson-Klasse (n) erweitern und die Namenskonvention so ändern? – DwB

+0

Sie können einige Teile überschreiben (AnnotationIntrospector, BeanSerializerFactory), um dies zu tun.Aber es gibt noch keine sauber externalisierte Möglichkeit, um Benennungsstrategien hinzuzufügen (die von mehreren Benutzern angefordert wurden). – StaxMan

Antwort

1

Ich löste das Problem durch Überschreiben der (De) Serialisierer. Für Interessierte, hier ist, wie Sie es selbst tun können:

Schritt 1. Erweitern BeanSerializerFactory.

Überschreiben Sie die _constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember) Methode. Innerhalb dieser Methode ändern Sie name in jeder Weise, die Sie für richtig halten. Um das Pascal-Gehäuse zu implementieren, habe ich diese Zeile verwendet: String formattedName = name.substring(0, 1).toUpperCase() + name.substring(1);. Rufen Sie super._constructWriter nach dem Ändern name.

Schritt 2. Erweitern Sie BeanDeserializationFactory.

Überschreiben Sie die constructSettableProperty(DeserializationConfig config, BasicBeanDescription beanDesc, String name, AnnotatedMethod setter) Methode. Tun Sie dasselbe mit dem Parameter name, den Sie in Ihrer benutzerdefinierten BeanSerializerFactory getan haben.

Schritt 3. Erstellen Sie eine ObjectMapper.

Stellen Sie die Serializer Factory als Ihre eigene Bean Serializer Factory ein. Stellen Sie den Deserializer-Provider ein (Ich habe diese Zeile verwendet: objectMapper.setDeserializerProvider(new StdDeserializerProvider(new CustomJacksonBeanDeserializerFactory()))).

Das ist es. Die von Ihnen erstellte ObjectMapper verwendet Ihr neues Namensschema beim Serialisieren oder Deserialisieren von JSON.

0

Für was es wert ist, gibt es eine Jira issue zur Unterstützung von Pluggable-Strategien; Wenn Sie dafür stimmen, können Entwickler davon überzeugt werden, Support hinzuzufügen. Wie ich im Kommentar erwähnte, ist es möglich, das interne Verhalten zu übersteuern, aber es ist nicht einfach.

Verwandte Themen