You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/09/23 12:22:48 UTC

(camel) 01/01: CAMEL-24931: camel-jsonpath, camel-jq - the null body hint says how to read the data

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch fix/CAMEL-24931
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 11a55ca9ee0146bc8b046ae31bbe15978e185400
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Sep 23 14:22:26 2026 +0200

    CAMEL-24931: camel-jsonpath, camel-jq - the null body hint says how to read the data
    
    A route reached with direct: has the body of its caller, and when the caller
    has none - a REST GET, a timer - a jsonpath or jq step in it has nothing to
    read. The message said to read the JSON first and named the mechanisms, but
    "set it with setBody" does not say what to put in the setBody, which is the
    answer for the common case of a file the route knows the name of.
    
    It now carries the rule and both forms: setBody with constant:
    resource:file:data.json for a known file, or poll:, pollEnrich or a from:
    consumer for one that is not.
    
    In the AI route benchmark this failure produced 24 exceptions per run over five
    runs, with the message read every time and the read never added.
    
    Co-Authored-By: Claude Opus 5 (1M context) <no...@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj
---
 .../src/main/java/org/apache/camel/language/jq/JqExpression.java  | 6 ++++--
 .../java/org/apache/camel/language/jq/JqNullBodyHintTest.java     | 6 ++++--
 .../src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java   | 6 ++++--
 .../java/org/apache/camel/jsonpath/JsonPathNullBodyHintTest.java  | 8 ++++++--
 4 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java
index e955500c3072..6b9071447372 100644
--- a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java
+++ b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java
@@ -210,8 +210,10 @@ public class JqExpression extends ExpressionAdapter implements ExpressionResultT
     private String nullSourceHint() {
         if ("body".equals(source.toString())) {
             // a timer alone, or a jq step placed before the file was read: nothing to evaluate
-            return "the jq expression got no message body to evaluate, the body is null: read the JSON before the step"
-                   + " with poll: file:..., pollEnrich or a from: consumer, or set it with setBody";
+            return "the jq expression got no message body to evaluate, the body is null: a route reached with direct:"
+                   + " has the body of its caller, so when the caller has none, read the data first - setBody with"
+                   + " constant: resource:file:data.json for a known file, or poll:, pollEnrich or a from: consumer"
+                   + " for one that is not";
         }
         return "the jq expression got no input from " + source + " to evaluate, it is null: set it before the step,"
                + " or leave source unset to use the message body";
diff --git a/components/camel-jq/src/test/java/org/apache/camel/language/jq/JqNullBodyHintTest.java b/components/camel-jq/src/test/java/org/apache/camel/language/jq/JqNullBodyHintTest.java
index 8504c5046b8f..0155f8728908 100644
--- a/components/camel-jq/src/test/java/org/apache/camel/language/jq/JqNullBodyHintTest.java
+++ b/components/camel-jq/src/test/java/org/apache/camel/language/jq/JqNullBodyHintTest.java
@@ -52,8 +52,10 @@ public class JqNullBodyHintTest extends JqTestSupport {
                 "should keep the original message, but was: " + message);
         assertTrue(message.contains("the jq expression got no message body to evaluate, the body is null"),
                 "should say the body is null, but was: " + message);
-        assertTrue(message.contains("set it with setBody"),
-                "should say how to load a body, but was: " + message);
+        assertTrue(message.contains("constant: resource:file:"),
+                "should show the form for a known file, but was: " + message);
+        assertTrue(message.contains("poll:"),
+                "should offer poll for a file that is not known in advance, but was: " + message);
     }
 
     @Test
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
index b8f72fd758b9..67cd783abe30 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
@@ -223,8 +223,10 @@ public class JsonPathEngine {
             // a timer alone, or a jsonpath step placed before the file was read: nothing to evaluate
             if (fromBody) {
                 throw new CamelExchangeException(
-                        "The jsonpath expression got no message body to evaluate (the body is null): read the JSON before"
-                                                 + " the step with poll: file:..., pollEnrich or a from: consumer, or set it with setBody",
+                        "The jsonpath expression got no message body to evaluate (the body is null): a route reached"
+                                                 + " with direct: has the body of its caller, so when the caller has none, read the data"
+                                                 + " first - setBody with constant: resource:file:data.json for a known file, or poll:,"
+                                                 + " pollEnrich or a from: consumer for one that is not",
                         exchange);
             }
             throw new CamelExchangeException(
diff --git a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathNullBodyHintTest.java b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathNullBodyHintTest.java
index aa952fab1aab..da5d42df3d98 100644
--- a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathNullBodyHintTest.java
+++ b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathNullBodyHintTest.java
@@ -51,8 +51,12 @@ public class JsonPathNullBodyHintTest extends CamelTestSupport {
 
         assertTrue(message.contains("The jsonpath expression got no message body to evaluate (the body is null)"),
                 "should say the body is null, but was: " + message);
-        assertTrue(message.contains("set it with setBody"),
-                "should say how to load a body, but was: " + message);
+        assertTrue(message.contains("constant: resource:file:"),
+                "should show the form for a known file, but was: " + message);
+        assertTrue(message.contains("poll:"),
+                "should offer poll for a file that is not known in advance, but was: " + message);
+        assertTrue(message.contains("has the body of its caller"),
+                "should say why the body is null in a direct: route, but was: " + message);
     }
 
     @Test