Claus Ibsen created CAMEL-24916:
-----------------------------------
Summary: camel-bean: ${body.name} on a Map reads the key when
there is no such method
Key: CAMEL-24916
URL: https://issues.apache.org/jira/browse/CAMEL-24916
Project: Camel
Issue Type: Improvement
Components: camel-bean
Reporter: Claus Ibsen
In the local-model benchmark (s11 and s12, 5 runs each of four HTTP rungs) the
loudest runtime failure by far is dot access on a Map body:
{noformat}
Failed to invoke method: sku on {sku=CAMEL-MUG, qty=42, price=12.5} of type
java.util.LinkedHashMap
Method with name: sku not found on bean: {sku=CAMEL-MUG, qty=42, price=12.5}
{noformat}
3582 occurrences in s12, 3492 in s11 - more than every other runtime error
together. It comes from routes that unmarshal JSON and then read a field with
{{$\{body.sku\}}} instead of {{$\{body[sku]\}}}.
CAMEL-24838 already added a hint to the message ("the value is a Map: a key is
read with [sku]"), and it does not stop it happening, because dot access on a
map is what jq, JavaScript, Groovy and most JSON tooling do.
Proposal: in {{BeanExpression}}, when the OGNL method call fails with a
method-not-found and the bean is a {{Map}} that contains a key of that name,
read the key instead of throwing. Additive:
* a method still wins, so {{$\{body.size\}}} on a Map keeps calling {{size()}}
and nothing that works today changes
* an unknown name still throws, because the key must be present - a typo is
still reported
* only the path that throws today can now return a value
This helps humans as much as models: it is a frequent question on the mailing
list and in chat.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)