Details
-
Bug
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
2.10.4
-
None
-
None
-
JXPath used as Expression language
-
Patch Available
-
Unknown
Description
DefaultMessage uses CaseInsensitiveMap for storing headers. If header name contains uppercase characters, then jxpath expression with correct case will not match.
E.g. header named fooBarBaz on "in" message will not be matched by following jxpath expression:
<jxpath>/in/headers/fooBarBaz = something</jxpath>
JXPath evaluates nodes that match the fooBarBaz name and uses the keySet() to obtain candidates. The problem is that CaseInsensitiveMap.keySet() returns the converted internal keys, instead of the original keys.
Is it possible to override the keySet() method of CaseInsensitiveMap to return the original keys? Then a user will not be unpleasantly surprised that his key is not in the key set.
@Override public Set<String> keySet() { return originalKeys.values(); }
There are two workarounds possible but neither of them is nice in my eyes.
- use only lowercase header names
- register custom DynamicPropertyHandler in JXPath
Ad 1. this probably wasn't the intention. User must rely on implementation of private method CaseInsensitiveMap.assembleKey(). This then defeats the purpose of case insensitiveness.
Ad 2. custom property handler must be registered via JXPathIntrospector.registerDynamicClass() "in the start", e.g. before anybody calls JXPathIntrospector.getBeanInfo(). In our projects it was enough to declare an extra eagerly-instantiated singleton Spring bean.
<bean class="CaseInsensitiveMapPropertyHandler" init-method="init" autowire-candidate="false" lazy-init="false" />
Attachments
Attachments
Issue Links
- depends upon
-
CAMEL-8095 CaseInsensitiveMap for Camel headers should preserve original key cases in keySet
- Resolved