Hi - sorry for the late reply. Some money making stuff was a bit important.
If I have a choice list like this:
<choice>
<when>
<simple>${header.type} == ${type:Type.TYPE1}</simple>
<to uri="direct:toType1Handler"/>
</when>
<when>
<simple>${header.type} == ${type:Type.TYPE2}</simple>
<to uri="direct:toType2Handler"/>
</when>
<when>
<simple>${header.type} == ${type:Type.TYPE3}</simple>
<to uri="direct:toType3Handler"/>
</when>
<otherwise>
<log message="Don't know how to handle ${header.type} -
ignoring" loggingLevel="WARN"/>
</otherwise>
</choice>
With Type being:
public enum Type {
TYPE1("This is type 1"), TYPE2("This is type 2"),TYPE3("This is type 3");
private final String description;
Type(String s) {
this.description = s;
}
@Override
public String toString() {
return description;
}
}
The header 'type' is an actual enum and not a string.
The method ObjectHelper.lookupConstantsFieldValue will do a comparison on all
the field names and if found return the toString value of the field value. In
this case is different than the default implementation of toString on enum
which returns the name of the enum, thus the comparison in the choice list
fails. It will always end up in the otherwise. If I were to use the default
toString method it would work.
For the above example, the lookupConstantsFieldValue will for the first choice
be given the values (Type.class, "TYPE1") - then lookupConstantsFieldValue will
find TYPE1 field in the Type class, get the actual enum and then return the
toString on the value, which in this case will be "This is type 1" causing the
comparison to fail although it found the right one.
Hopefully it makes sense 🙂
Svend Ole Nielsen Office +4596962640
Developer
[email protected]<mailto:[email protected]>
www.addsecure.com<http://www.addsecure.com/>
[cid:addsecure-logo_50e643a1-ceaa-48aa-817f-52769402fe0c.png]<http://www.addsecure.com/>
[cid:fb_626b0b2c-0bba-4c8b-a645-72b180ce970e.png]
<https://www.facebook.com/AddSecure/>
[cid:li_2f98ce3b-2546-4c48-bcb2-9680df7d09ea.png]
<https://www.linkedin.com/company/addsecure/>
[cid:yt_8a8408e0-b9f1-4cca-9d75-77a496a95f00.png]
<https://www.youtube.com/channel/UC9RMhgoc3z23vy93yBRAygA>
For a safer and smarter world
NOTE: This e-mail (including any attachments) is for the sole use of the
intended recipient(s) and may contain information that confidential and/or
protected by legal privilege. Any unauthorized review, use, copy, disclosure or
distribution of this e-mail is strictly prohibited. If you are not the intended
recipient, please notify AddSecure immediately and destroy all copies of this
e-mail. AddSecure does not accept any liability for breach of security, error
or virus that may result from the transmission of this message.
________________________________
Fra: Claus Ibsen <[email protected]>
Sendt: 15. marts 2023 12:33
Til: [email protected] <[email protected]>
Emne: Re: Enum comparing does not work when toString is overridden
CAUTION: External email
Hi
Can you maybe post some more details such as a bit of code of your enums. As we
could possible improve that code to deal with enums in a specific way.
On Mon, Mar 6, 2023 at 12:30 PM Svend Ole Nielsen
<[email protected]<mailto:[email protected]>> wrote:
Hi
I have been scratching my head for a couple of days wondering why my simple
comparison in a choice list in Camel has always gone wrong. I'm comparing
"complex" enums that have name and then a more human eatable name. This human
eatable name is being printed out in an overridden toString method.
Found out that if I don't override toString everything works fine. It looks
like there is something fishy going on with the 'lookupConstantFieldValue'
method in ObjectHelper class. It does some comparing on name and eventually
returns toString. Would have thought it would make more sense to return name -
seen as in a normal non-overridden tostring that returns name.
Have searched Jira but found nothing related to this so wondering if I have
stumpled upon a bug of some sorts
Svend Ole Nielsen Office +4596962640
Developer
[email protected]<mailto:[email protected]>
www.addsecure.com<http://www.addsecure.com/>
[cid:186e50b5c732fe8053a1]<http://www.addsecure.com/>
[cid:186e50b5c73900cd1922] <https://www.facebook.com/AddSecure/>
[cid:186e50b5c73916028e73] <https://www.linkedin.com/company/addsecure/>
[cid:186e50b5c7396547e524]
<https://www.youtube.com/channel/UC9RMhgoc3z23vy93yBRAygA>
For a safer and smarter world
NOTE: This e-mail (including any attachments) is for the sole use of the
intended recipient(s) and may contain information that confidential and/or
protected by legal privilege. Any unauthorized review, use, copy, disclosure or
distribution of this e-mail is strictly prohibited. If you are not the intended
recipient, please notify AddSecure immediately and destroy all copies of this
e-mail. AddSecure does not accept any liability for breach of security, error
or virus that may result from the transmission of this message.
--
Claus Ibsen
-----------------
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2