[ 
https://issues.apache.org/jira/browse/LANG-985?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16361513#comment-16361513
 ] 

Osman Shoukry commented on LANG-985:
------------------------------------

If you use OpenPojo's toString it won't cause an issue while trying to call 
"hashCode" which is the default implementation for toString on Object as 
OpenPojo's toString doesn't call hashCode.

> ToStringBuilder reliably handle OpenPojo @BusinessKey annotated instances
> -------------------------------------------------------------------------
>
>                 Key: LANG-985
>                 URL: https://issues.apache.org/jira/browse/LANG-985
>             Project: Commons Lang
>          Issue Type: Wish
>          Components: lang.builder.*
>            Reporter: David Green
>            Priority: Minor
>              Labels: features
>             Fix For: Discussion
>
>
> We use Google's OpenPojo library, annotating DTOs and persistence entities 
> with @BusinessKey in order to remove boilerplate hashcode() and equals().
> I recently started noticing toString() was throwing exceptions when I didn't 
> populate @BusinessKey annotated field(s) as I was using the Null Object 
> Pattern.  A workaround was to populate dummy values but there's a risk this 
> could be considered a real value further down the line, so looked for an 
> alternative solution and came up with the following extending 
> StandardToStringStyle:-
> {code}
> import org.apache.commons.lang3.builder.StandardToStringStyle;
> import org.apache.commons.lang3.builder.ToStringStyle;
> public class CustomToStringStyle extends StandardToStringStyle {
>     public static final ToStringStyle OPENPOJO_SAFE_STYLE = 
> createOpenPojoSafeStyle();
>     /**
>      * Works better with {@link com.openpojo.business.annotation.BusinessKey} 
> annotated OpenPojo classes.
>      * 
>      * This instance does not call {@link ToStringStyle}.register(...)
>      * which can throw a {@link 
> com.openpojo.business.exception.BusinessException} 
>        * if the key hasn't been populated, for example if you used the Null 
> Object Pattern.
>      */    
>     private static ToStringStyle createOpenPojoSafeStyle() {
>         final StandardToStringStyle style = new StandardToStringStyle();
>         style.setUseClassName(false);
>         style.setUseIdentityHashCode(false);
>         return style;
>     }
> }
> {code}
> Used as follows:
> {code}
>     @Override
>     public String toString() {
>         return ToStringBuilder.reflectionToString(this, 
> CustomToStringStyle.OPENPOJO_SAFE_STYLE);
>     }
> {code}
> I realise this doesn't handle recursion in fields because it skips over 
> ToStringStyle.register(..) but this suffices for our use case right now - 
> perhaps an alternative implementation overriding register() that uses a List 
> (with documented performance penalty) could be added.
> Is there anything already in Commons that could do this? If not we would like 
> this to be considered for inclusion in commons lang (happy to help out with 
> development), potentially with implementation improvements by those who know 
> the code base better.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to