Claus Ibsen created CAMEL-25871:
-----------------------------------
Summary: camel-bean - a hint for an OGNL read on a List and on a
variable that holds a file
Key: CAMEL-25871
URL: https://issues.apache.org/jira/browse/CAMEL-25871
Project: Camel
Issue Type: Improvement
Components: camel-bean
Reporter: Claus Ibsen
Fix For: 4.24.0
Two errors of a Simple OGNL read give no hint, and a coding agent got stuck on
both in a night of runs against a local model (thousands of failed exchanges in
a few runs).
*1. ${body.orderId} on a List*
The body is the List of an unmarshalled JSON array, and the route wants the
order with an id:
{noformat}
Failed to invoke method: orderId on the message body of type
java.util.ArrayList due to:
org.apache.camel.component.bean.MethodNotFoundException: Method with name:
orderId not found on bean: [{orderId=ORD-1001, ...}, ...] of type:
java.util.ArrayList
{noformat}
The agent then made up methods, such as {{${body.find(o -> o.orderId ==
header.id)}}} and {{${body.?[orderId == ...]}}}, with the same error.
{{${body[orderId]}}} on a List already gets a hint (CAMEL-25746), but the
method path does not.
Fix: "(a List has no method or key orderId: pick an element first, such as
[0].orderId, or the element whose orderId has a given value with jsonpath, such
as jsonpath: "$[?(@.orderId == '${header.orderId}')]" with resultType
java.util.Map, or split it)". For a made-up method, the same with a placeholder
field name.
*2. ${variable.customer[name]} on a variable that holds a file*
pollEnrich with variableReceive puts the polled file in the variable (a
GenericFile), not its data:
{noformat}
Key: name not found in bean: GenericFile[C-482.json] of type:
org.apache.camel.component.file.GenericFile using OGNL path [[name]]
{noformat}
On the body, the same read already says to unmarshal the file first
(CAMEL-25749). On a variable it says nothing.
Fix: "(the value is the file as read (a GenericFile), not its data: unmarshal
it first, for example with json, then read the key; a variable is unmarshalled
in place with variableSend and variableReceive set to its name, such as
unmarshal: {json: {}, variableSend: customer, variableReceive: customer})". The
same for a java.io.File.
_Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)