2015-11-06 31 views
7

Używam zależność:Jak mieć RecursiveToStringStyle i JSON_STYLE użyciu commons-lang3

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

mam następujące obiekty:

public Class X { 

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

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

I muszę zalogować zawartość klasy X rekursywnie, aby uzyskać klasę Y oraz styl JSON. To jest mój cel i taki jest cel tego pytania.

Sposób 1:

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

Sposób 1 Wynik:

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

Sposób 2:

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

Sposób 2 Wynik:

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

Udane Podejście:

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

Pozytywny wynik Approach (Mój cel):

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

Brzmi jak żądanie funkcji, które można złożyć ... Może być zaimplementowane jako podklasa programu RecursiveToStringStyle, podobnie do istniejącego MultilineRecursiveToStringStyle. – Thilo

+0

Tak, już próbuję tego podejścia. Ale myślę, że musi istnieć lepszy sposób osiągnięcia mojego celu. Może używając innej zależności? – Leonel

Odpowiedz

1

znalazłem rozwiązanie. Muszę Override metodę toString każdego classes (X i Y w tym przypadku)

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); 
    } 
} 

A teraz, z podejściem 1 to działa.

+0

Czy zgadzasz się z Thilo? – Leonel

+0

Oczywiście, to zadziała, jeśli możesz zmienić metody "toString" dla wszystkich zaangażowanych klas. Dobrą rzeczą w ToStringBuilder jest to, że może być zewnętrzny. Ale po co robić rzeczy bardziej skomplikowane, niż to konieczne. – Thilo