I’m using the dependency:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency>
I have the following objects:
public Class X { private String a; private String b; private Y y; } public Class Y { private String c; private String d; }
And I need to log the content of the class X recursively to get the class Y as well and using the JSON style. That is my goal and this is the purpose of this question.
Approach 1:
ToStringStyle style = ToStringStyle.JSON_STYLE; LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
Approach 1 result:
{"a":"<a>","b":"<b>","y": com.<packages>.y@<hash>}
Approach 2:
RecursiveToStringStyle style = new RecursiveToStringStyle(); LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
Approach 2 result:
[com.<packages>.x@<hash>[a=<a>,b=<b>,y=com.<packages>.y@<hash>[c=<c>,d=<d>]]
Successful Approach:
`Merge of Approach 1 and Approach 2` but how to achieve this?
Successful Approach result (My goal):
{"a":"<a>","b":"<b>","y":{"c":"<c>","d":"<d>"}}
Advertisement
Answer
I found the solution. I need to Override
the method toString
of each classes
(X
and Y
in this case)
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); } }
And now, with the approach 1 It’s working.