2013-01-13 9 views
5

Wir verwenden die JSON-Serialisierung mit Jackson, um den internen Status des Systems für Debugging-Eigenschaften anzuzeigen.Wie transient Felder mit Jackson serialisieren?

Standardmäßig serialisiert Jackson transiente Felder nicht - aber ich möchte sie auch serialisieren. Wie kann ich diese Felder serialisieren?

Eine Möglichkeit, die ich kenne, ist ein Getter für diese Felder zu liefern - aber ich möchte das nicht tun, da ich einige getX-Methoden habe, die ich nicht aufgerufen werden möchte (zum Beispiel gibt es einige Getter die den Objektstatus ändern).

Ich weiß, ich könnte eine Annotation erstellen, aber ich möchte es wirklich vermeiden.

Also meine Frage ist: Gibt es eine Möglichkeit zur Einrichtung jackson alle die Objekte Felder zu serialisiert? schließe vorübergehende ein.

+1

Wenn Sie @ javax.persistence.Transient Felder serialisiert werden, siehe [Gere Antwort] (http://stackoverflow.com/a/29109806/606662): –

+0

Vereinbarte mit @Markus Pscheidt – dirai

Antwort

6

Ich glaube nicht, Jackson unterstützt jede Art von Konfiguration, damit es ein transientes Feld serialisieren kann. Es ist eine offene Frage, dass die Funktion hinzuzufügen, aber es ist alt und wurde nicht angesprochen (wie weit kann ich sagen): http://jira.codehaus.org/browse/JACKSON-623

Also meine Frage ist: Gibt es eine Möglichkeit zur Einrichtung jackson all zu serialisiert die Objekte Felder? schließe vorübergehende ein.

So, um Ihre Frage zu beantworten, nein.

Einige andere Java JSON-Tools wie GSON unterstützen eine Konfigurationsoption zum Serialisieren von transienten Feldern. Wenn Sie ein anderes Werkzeug verwenden können, schauen Sie sich das an (für GSON, siehe: https://sites.google.com/site/gson/gson-user-guide).

Um etwas zu erweitern, könnten Sie einen anderen Ansatz versuchen.

Zuerst sollten Sie nicht versuchen, ein transientes Feld zu serialisieren. Nach all der Definition von Transient ist "dies nicht zu serialisieren". Nichtsdestotrotz kann ich mir einige spezielle Situationen vorstellen, in denen es notwendig oder zumindest praktisch ist (zB wenn man mit Code arbeitet, den man nicht ändern kann oder so). In 99% der Fälle lautet die Antwort: Tu das nicht. Ändern Sie das Feld so, dass es nicht vorübergehend ist, wenn Sie es serialisieren müssen. Wenn Sie mehrere Kontexte haben, in denen Sie dasselbe Feld verwenden und in einem (JSON zum Beispiel) serialisiert und in einem anderen nicht serialisiert werden sollen (beispielsweise java.io), sollten Sie einen benutzerdefinierten Serializer für den Fall erstellen, in dem Sie wollen es nicht, anstatt das Keyword zu missbrauchen.

Zweitens, mit einem Getter und "einige Getter, die den Zustand der Objekte ändern", sollten Sie versuchen, dies zu vermeiden. Dies kann zu verschiedenen unbeabsichtigten Konsequenzen führen. Und technisch ist das kein Getter, das ist ein Setter. Was ich meine ist, wenn es Status mutiert, haben Sie einen Mutator (Setter) und nicht Accessor (Getter), auch wenn Sie es nach der "Get" Konvention benennen und etwas zurückgeben.

0

Sie können einen benutzerdefinierten Getter für dieses vorübergehende Feld erstellen und das @ XmlElement-Attribut verwenden. Es spielt keine Rolle, wer der Getter ist.

Zum Beispiel:

public class Person { 

    @XmlTransient private String lastname; 

    @XmlElement(name="lastname") 
    public String getAnyNameOfMethod(){ 
     return lastname; 
    } 

} 
10

Meine Lösung mit Jackson 2.4.3:

private static final ObjectMapper mapper = 
     new ObjectMapper(){{ 

      Hibernate4Module module = new Hibernate4Module(); 
      module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION); 
      registerModule(module); 

     }}; 
Verwandte Themen