2015-11-06 9 views
7

ich die Abhängigkeit bin mit:Wie haben RecursiveToStringStyle und JSON_STYLE mit commons-LANG3

<dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.4</version> 
    </dependency> 

Ich habe die folgenden Objekte:

public Class X { 

    private String a; 
    private String b; 
    private Y y; 
} 

public Class Y { 
    private String c; 
    private String d; 
} 

Und ich brauche den Inhalt der Klasse X anmelden rekursiv, um auch die Klasse Y zu erhalten und den JSON-Stil zu verwenden. Das ist mein Ziel und das ist der Zweck dieser Frage.

Ansatz 1:

ToStringStyle style = ToStringStyle.JSON_STYLE; 
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false)); 

Ansatz 1 Ergebnis:

{"a":"<a>","b":"<b>","y": com.<packages>[email protected]<hash>} 

Ansatz 2:

RecursiveToStringStyle style = new RecursiveToStringStyle(); 
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false)); 

Ansatz 2 Ergebnis:

[com.<packages>[email protected]<hash>[a=<a>,b=<b>,y=com.<packages>[email protected]<hash>[c=<c>,d=<d>]] 

Erfolgreiche Ansatz:

`Merge of Approach 1 and Approach 2` but how to achieve this? 

erfolgreicher Ansatz Ergebnis (Mein Ziel):

{"a":"<a>","b":"<b>","y":{"c":"<c>","d":"<d>"}} 
+0

Klingt wie eine Feature-Anforderung, die Sie Datei ... könnte als eine Unterklasse von RecursiveToStringStyle, ähnlich dem vorhandenen MultilineRecursiveToStringStyle implementiert werden. – Thilo

+0

Ja, ich versuche diesen Ansatz bereits. Aber ich denke, es muss einen besseren Weg geben, um mein Ziel zu erreichen. Vielleicht eine andere Abhängigkeit verwenden? – Leonel

Antwort

1

fand ich die Lösung. Ich brauche die Methode toString jeden classes (X und Y in diesem Fall)

public Class X { 

    private String a; 
    private String b; 
    private Y y; 

    @Override 
    public String toString() { 
    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); 
    } 
} 

public Class Y { 
    private String c; 
    private String d; 

    @Override 
    public String toString() { 
    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); 
    } 
} 

Und nun Override, mit dem Ansatz 1 Es funktioniert.

+0

Stimmen Sie Thilo zu? – Leonel

+0

Sicher, das würde funktionieren, wenn Sie die 'toString' Methoden aller beteiligten Klassen ändern können. Das Schöne am ToStringBuilder ist, dass es extern sein kann. Aber warum sollte es komplizierter als nötig werden? – Thilo