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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a969c9a2065e11ef2444441bbbadb0aad76606ad
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Oct 24 19:57:03 2026 +0200

    CAMEL-24961: Catalog body types for the seven ignite components, ehcache, 
jcache and state-store (#28397)
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../apache/camel/catalog/components/ehcache.json   |  5 +++
 .../camel/catalog/components/ignite-cache.json     |  5 +++
 .../camel/catalog/components/ignite-compute.json   |  4 ++
 .../camel/catalog/components/ignite-events.json    |  3 ++
 .../camel/catalog/components/ignite-idgen.json     |  4 ++
 .../camel/catalog/components/ignite-messaging.json |  5 +++
 .../camel/catalog/components/ignite-queue.json     |  4 ++
 .../camel/catalog/components/ignite-set.json       |  4 ++
 .../apache/camel/catalog/components/jcache.json    |  5 +++
 .../camel/catalog/components/state-store.json      |  4 ++
 .../camel/catalog/docs/ignite-cache-component.adoc |  3 +-
 .../apache/camel/component/ehcache/ehcache.json    |  5 +++
 .../camel/component/ehcache/EhcacheEndpoint.java   | 32 +++++++++++++++
 .../camel/component/ignite/cache/ignite-cache.json |  5 +++
 .../component/ignite/compute/ignite-compute.json   |  4 ++
 .../component/ignite/events/ignite-events.json     |  3 ++
 .../camel/component/ignite/idgen/ignite-idgen.json |  4 ++
 .../ignite/messaging/ignite-messaging.json         |  5 +++
 .../camel/component/ignite/queue/ignite-queue.json |  4 ++
 .../camel/component/ignite/set/ignite-set.json     |  4 ++
 .../src/main/docs/ignite-cache-component.adoc      |  3 +-
 .../ignite/cache/IgniteCacheEndpoint.java          | 45 ++++++++++++++++++++++
 .../ignite/compute/IgniteComputeEndpoint.java      | 22 +++++++++++
 .../ignite/events/IgniteEventsEndpoint.java        |  7 ++++
 .../ignite/idgen/IgniteIdGenEndpoint.java          | 15 ++++++++
 .../ignite/messaging/IgniteMessagingEndpoint.java  | 16 ++++++++
 .../ignite/queue/IgniteQueueEndpoint.java          | 38 ++++++++++++++++++
 .../component/ignite/set/IgniteSetEndpoint.java    | 31 +++++++++++++++
 .../org/apache/camel/component/jcache/jcache.json  |  5 +++
 .../camel/component/jcache/JCacheEndpoint.java     | 36 +++++++++++++++++
 .../camel/component/statestore/state-store.json    |  4 ++
 .../component/statestore/StateStoreEndpoint.java   | 22 +++++++++++
 32 files changed, 354 insertions(+), 2 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ehcache.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ehcache.json
index 57128105f2aa..64de7a9d7660 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ehcache.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ehcache.json
@@ -51,6 +51,11 @@
     "CamelEhcacheOldValue": { "index": 6, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "Object", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The old value associated to a key for actions like 
PUT_IF_ABSENT or the Object used for comparison for actions like REPLACE", 
"constantName": "org.apache.camel.component.ehcache.EhcacheConstants#OLD_VALUE" 
},
     "CamelEhcacheEventType": { "index": 7, "kind": "header", "displayName": 
"", "group": "common", "label": "", "required": false, "javaType": "EventType", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The type of event received", "constantName": 
"org.apache.camel.component.ehcache.EhcacheConstants#EVENT_TYPE" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "description": "The new value 
of the entry, as it was put, with the key in the CamelEhcacheKey header, the 
event in CamelEhcacheEventType and the previous value in CamelEhcacheOldValue. 
A REMOVED, EXPIRED or EVICTED event has no body" },
+    "producerIn": { "carriers": [ "any" ], "description": "The value to store 
for PUT, PUT_IF_ABSENT and REPLACE, converted to the valueType when set, and a 
Map of the entries for PUT_ALL, unless the CamelEhcacheValue header gives it. 
The value is stored as it is: a stream is read once, so convert it to text or 
bytes first. The other actions do not use the body" },
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"action", "value": "GET_ALL", "carriers": [ "map" ], "javaType": 
"java.util.Map" }, { "option": "action", "value": "PUT", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "PUT_ALL", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "PUT_IF_ABSENT", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "REPLACE", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "REMOVE", [...]
+  },
   "properties": {
     "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", 
"group": "common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "the cache name" },
     "cacheManager": { "index": 1, "kind": "parameter", "displayName": "Cache 
Manager", "group": "common", "label": "", "required": false, "type": "object", 
"javaType": "org.ehcache.CacheManager", "deprecated": false, "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.ehcache.EhcacheConfiguration", 
"configurationField": "configuration", "description": "The cache manager" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-cache.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-cache.json
index 6185c4786199..348cb48c6c01 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-cache.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-cache.json
@@ -40,6 +40,11 @@
     "CamelIgniteCacheName": { "index": 5, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "This header carries the cache name for which a 
continuous query event was received (consumer). It does not allow you to 
dynamically change the cache against which a producer operation is performed. 
Use EIPs for that (e.g. recipient l [...]
     "CamelIgniteCacheOldValue": { "index": 6, "kind": "header", "displayName": 
"", "group": "common", "label": "", "required": false, "javaType": "Object", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "(producer) The old cache value to be replaced when 
invoking the REPLACE operation. (consumer) This header carries the old cache 
value when passed in the incoming cache event.", "constantName": 
"org.apache.camel.component.ignite.IgniteConst [...]
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"oneExchangePerUpdate", "value": "false", "carriers": [ "list" ] }, { "option": 
"fireExistingQueryResults", "value": "true", "carriers": [ "unknown" ] } ], 
"description": "The new value of the cache entry that changed, with its key in 
the CamelIgniteCacheKey header, the old value in CamelIgniteCacheOldValue and 
the event type in CamelIgniteCacheEventType. With oneExchangePerUpdate=false a 
List of the CacheEntryEven [...]
+    "producerIn": { "carriers": [ "any" ], "description": "PUT and REPLACE 
store the body as the value of the key in the CamelIgniteCacheKey header, and a 
PUT of a Map puts all its entries; no body fails. GET and REMOVE take the key 
from that header, or else from the body, where a Set is several keys. QUERY 
needs an Ignite Query in the body or the CamelIgniteCacheQuery header. SIZE, 
CLEAR and REBALANCE do not use the body. The operation is the operation option 
or the CamelIgniteCacheOper [...]
+    "producerOut": { "carriers": [ "unknown" ], "dependsOn": [ 
"propagateIncomingBodyIfNoReturnValue" ], "byOption": [ { "option": 
"operation", "value": "PUT", "carriers": [ "unchanged", "null" ] }, { "option": 
"operation", "value": "REPLACE", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "REMOVE", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "CLEAR", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "REBALANCE", "carriers": [ "unchan [...]
+  },
   "properties": {
     "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", 
"group": "common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The cache name." },
     "propagateIncomingBodyIfNoReturnValue": { "index": 1, "kind": "parameter", 
"displayName": "Propagate Incoming Body If No Return Value", "group": "common", 
"label": "", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Sets whether to propagate the incoming body if the return type 
of the underlying Ignite operation is void." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-compute.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-compute.json
index eccaa68ab3f7..6e2bedb40a51 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-compute.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-compute.json
@@ -37,6 +37,10 @@
     "CamelIgniteComputeAffinityCacheName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Affinity cache name for the 
AFFINITY_CALL and AFFINITY_RUN operations.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_COMPUTE_AFFINITY_CACHE_NAME"
 },
     "CamelIgniteComputeAffinityKey": { "index": 4, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Affinity key for the AFFINITY_CALL and 
AFFINITY_RUN operations.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_COMPUTE_AFFINITY_KEY" 
}
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "pojo", "list" ], "dependsOn": [ "taskName" 
], "description": "The job to run on the cluster, by executionType: an 
IgniteCallable for CALL and AFFINITY_CALL, an IgniteRunnable for RUN and 
AFFINITY_RUN, a Collection of them for CALL and RUN, an IgniteCallable, 
IgniteRunnable or IgniteClosure for BROADCAST, an IgniteClosure for APPLY, and 
a ComputeTask or its Class for EXECUTE. Its parameters are in the 
CamelIgniteComputeParameters header. With taskName, E [...]
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"executionType", "value": "RUN", "carriers": [ "null" ] }, { "option": 
"executionType", "value": "AFFINITY_RUN", "carriers": [ "null" ] }, { "option": 
"executionType", "value": "BROADCAST", "carriers": [ "list", "null" ] } ], 
"description": "The result of the job. A Collection of callables, a broadcast 
and an APPLY of a Collection of parameters give a Collection of the results, 
unless an IgniteReducer in the CamelI [...]
+  },
   "properties": {
     "endpointId": { "index": 0, "kind": "path", "displayName": "Endpoint Id", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The endpoint ID (not 
used)." },
     "clusterGroupExpression": { "index": 1, "kind": "parameter", 
"displayName": "Cluster Group Expression", "group": "producer", "label": 
"producer", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.ignite.ClusterGroupExpression", "deprecated": 
false, "autowired": false, "secret": false, "description": "An expression that 
returns the Cluster Group for the IgniteCompute instance." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-events.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-events.json
index 74021fe55ba3..65d11dd6b9fd 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-events.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-events.json
@@ -30,6 +30,9 @@
     "igniteConfiguration": { "index": 3, "kind": "property", "displayName": 
"Ignite Configuration", "group": "consumer", "label": "", "required": false, 
"type": "object", "javaType": 
"org.apache.ignite.configuration.IgniteConfiguration", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows the user to set a 
programmatic ignite configuration." },
     "autowiredEnabled": { "index": 4, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "pojo" ], "javaType": 
"org.apache.ignite.events.Event", "description": "The Ignite Event, such as a 
CacheEvent or a JobEvent, with its type in type(); no headers are set. Ignite 
fires only the event types its configuration includes (includeEventTypes)" }
+  },
   "properties": {
     "endpointId": { "index": 0, "kind": "path", "displayName": "Endpoint Id", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The endpoint ID (not used)." },
     "clusterGroupExpression": { "index": 1, "kind": "parameter", 
"displayName": "Cluster Group Expression", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.ignite.ClusterGroupExpression", "deprecated": 
false, "autowired": false, "secret": false, "description": "The cluster group 
expression." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-idgen.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-idgen.json
index e3d3388e1a43..432245af793d 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-idgen.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-idgen.json
@@ -33,6 +33,10 @@
   "headers": {
     "CamelIgniteIdGenOperation": { "index": 0, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "org.apache.camel.component.ignite.idgen.IgniteIdGenOperation", 
"enum": [ "ADD_AND_GET", "GET", "GET_AND_ADD", "GET_AND_INCREMENT", 
"INCREMENT_AND_GET" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Allows you to dynamically change the ID 
Generator operation.", "constantName": "org [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "ADD_AND_GET", "carriers": [ "value", "text" ] }, { 
"option": "operation", "value": "GET_AND_ADD", "carriers": [ "value", "text" ] 
} ], "description": "ADD_AND_GET and GET_AND_ADD add the body to the sequence: 
a number, or text of one; no body fails. The other operations do not use the 
body, but text that is not a number still fails. The operation is the operation 
option or the CamelIgniteIdGenOper [...]
+    "producerOut": { "carriers": [ "value" ], "javaType": "java.lang.Long", 
"description": "The value of the sequence, as a Long" }
+  },
   "properties": {
     "name": { "index": 0, "kind": "path", "displayName": "Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The sequence name." },
     "batchSize": { "index": 1, "kind": "parameter", "displayName": "Batch 
Size", "group": "producer", "label": "producer", "required": false, "type": 
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": 
false, "secret": false, "description": "The batch size." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-messaging.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-messaging.json
index 641f44c6cff4..4be8d1517c78 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-messaging.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-messaging.json
@@ -35,6 +35,11 @@
     "CamelIgniteMessagingTopic": { "index": 0, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "(producer) Allows you to dynamically 
change the topic to send messages to. (consumer) It also carries the topic on 
which a message was received.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_MESSAGING_TOPIC" },
     "CamelIgniteMessagingUUID": { "index": 1, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.util.UUID", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "This header is filled in with the UUID 
of the subscription when a message arrives.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_MESSAGING_UUID" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "description": "The message as 
it was sent to the topic, with the topic in the CamelIgniteMessagingTopic 
header and the id of the subscription in CamelIgniteMessagingUUID" },
+    "producerIn": { "carriers": [ "text", "bytes", "value", "map", "list", 
"pojo" ], "description": "The message to send, as the object: it must be 
serializable for the other nodes, so a stream is not read. In UNORDERED mode a 
Collection is one message per element, unless 
treatCollectionsAsCacheObjects=true. No body fails. The topic is the 
CamelIgniteMessagingTopic header, or else the endpoint topic" },
+    "producerOut": { "carriers": [ "unchanged" ], "byOption": [ { "option": 
"propagateIncomingBodyIfNoReturnValue", "value": "false", "carriers": [ "null" 
] } ] }
+  },
   "properties": {
     "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": 
"common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The topic name." },
     "propagateIncomingBodyIfNoReturnValue": { "index": 1, "kind": "parameter", 
"displayName": "Propagate Incoming Body If No Return Value", "group": "common", 
"label": "", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Sets whether to propagate the incoming body if the return type 
of the underlying Ignite operation is void." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-queue.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-queue.json
index ba213e671e0f..cad10bfde3ea 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-queue.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-queue.json
@@ -36,6 +36,10 @@
     "CamelIgniteQueueTransferredCount": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The amount of items transferred as the 
result of the DRAIN operation.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_QUEUE_TRANSFERRED_COUNT"
 },
     "CamelIgniteQueueTimeoutMillis": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Dynamically sets the timeout in 
milliseconds to use when invoking the OFFER or POLL operations.", 
"constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_QUEUE_TIMEOUT_MILLIS" 
}
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "ADD, OFFER, PUT, 
CONTAINS, REMOVE and RETAIN_ALL use the body as the element, and a Collection 
as several elements unless treatCollectionsAsCacheObjects=true; no body fails 
ADD, CONTAINS, REMOVE and RETAIN_ALL. DRAIN drains into a Collection body, or a 
new List. The other operations do not use the body. The operation is the 
operation option or the CamelIgniteQueueOperation header; with neither the 
producer fails" },
+    "producerOut": { "carriers": [ "unknown" ], "dependsOn": [ 
"propagateIncomingBodyIfNoReturnValue" ], "byOption": [ { "option": 
"operation", "value": "ADD", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value": "OFFER", "carriers": [ 
"value" ], "javaType": "java.lang.Boolean" }, { "option": "operation", "value": 
"CONTAINS", "carriers": [ "value" ], "javaType": "java.lang.Boolean" }, { 
"option": "operation", "value": "REMOVE", "carriers": [ "valu [...]
+  },
   "properties": {
     "name": { "index": 0, "kind": "path", "displayName": "Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The queue name." },
     "capacity": { "index": 1, "kind": "parameter", "displayName": "Capacity", 
"group": "producer", "label": "producer", "required": false, "type": "integer", 
"javaType": "int", "deprecated": false, "autowired": false, "secret": false, 
"description": "The queue capacity. Default: non-bounded." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-set.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-set.json
index 61ab5f886eec..d1b61c964302 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-set.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ignite-set.json
@@ -33,6 +33,10 @@
   "headers": {
     "CamelIgniteSetsOperation": { "index": 0, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"org.apache.camel.component.ignite.set.IgniteSetOperation", "enum": [ 
"CONTAINS", "ADD", "SIZE", "REMOVE", "ITERATOR", "CLEAR", "RETAIN_ALL", "ARRAY" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Allows you to dynamically change the set operation.", 
"constantName": "org.apache.came [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "ADD, CONTAINS, 
REMOVE and RETAIN_ALL use the body as the element, and a Collection as several 
elements unless treatCollectionsAsCacheObjects=true; no body fails them. SIZE, 
ITERATOR, ARRAY and CLEAR do not use the body. The operation is the operation 
option or the CamelIgniteSetsOperation header; with neither the producer fails" 
},
+    "producerOut": { "carriers": [ "value", "iterator", "list", "unchanged" ], 
"dependsOn": [ "propagateIncomingBodyIfNoReturnValue" ], "byOption": [ { 
"option": "operation", "value": "ADD", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value": "CONTAINS", 
"carriers": [ "value" ], "javaType": "java.lang.Boolean" }, { "option": 
"operation", "value": "REMOVE", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value [...]
+  },
   "properties": {
     "name": { "index": 0, "kind": "path", "displayName": "Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The set name." },
     "configuration": { "index": 1, "kind": "parameter", "displayName": 
"Configuration", "group": "producer", "label": "producer", "required": false, 
"type": "object", "javaType": 
"org.apache.ignite.configuration.CollectionConfiguration", "deprecated": false, 
"autowired": false, "secret": false, "description": "The collection 
configuration. Default: empty configuration. You can also conveniently set 
inner properties by using configuration.xyz=123 options." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json
index a45226ae5024..45984af75d51 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json
@@ -43,6 +43,11 @@
     "CamelJCacheEntryProcessor": { "index": 6, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "EntryProcessor<Object, Object, Object>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
EntryProcessor to invoke", "constantName": 
"org.apache.camel.component.jcache.JCacheConstants#ENTRY_PROCESSOR" },
     "CamelJCacheEntryArgs": { "index": 7, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"Collection<Object>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The additional arguments to pass to the 
EntryProcessor", "constantName": 
"org.apache.camel.component.jcache.JCacheConstants#ARGUMENTS" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "description": "The value of 
the entry, as it was put, with the key in the CamelJCacheKey header and the 
event (CREATED, UPDATED, REMOVED or EXPIRED) in CamelJCacheEventType; with 
oldValueRequired the previous value is in the CamelJCacheOldValue header. A 
REMOVED or EXPIRED event has the old value as body when the provider gives it 
(Hazelcast does with oldValueRequired), else no body" },
+    "producerIn": { "carriers": [ "any" ], "description": "The value to store 
for PUT, PUTIFABSENT, REPLACE, GETANDPUT and GETANDREPLACE, as it is, and a Map 
of the entries for PUTALL; no body, or a body that is not a Map for PUTALL, 
fails. A provider that stores by value serializes it: a stream fails, so 
convert it to text or bytes first. The other actions do not use the body" },
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"action", "value": "GETALL", "carriers": [ "map" ], "javaType": "java.util.Map" 
}, { "option": "action", "value": "PUT", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "PUTALL", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "PUTIFABSENT", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "REPLACE", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "REMOVE", "ca [...]
+  },
   "properties": {
     "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", 
"group": "common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The name of the cache" },
     "cacheConfigurationProperties": { "index": 1, "kind": "parameter", 
"displayName": "Cache Configuration Properties", "group": "common", "label": 
"", "required": false, "type": "object", "javaType": "java.util.Properties", 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": 
"configuration", "description": "The Properties for the 
javax.cache.spi.CachingProvider to create the CacheM [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/state-store.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/state-store.json
index 47d003a36392..807a43c79cb4 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/state-store.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/state-store.json
@@ -33,6 +33,10 @@
     "CamelStateStoreKey": { "index": 1, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The key to use for the operation", 
"constantName": "org.apache.camel.component.statestore.StateStoreConstants#KEY" 
},
     "CamelStateStoreTtl": { "index": 2, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"Long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Per-message TTL override in milliseconds. 
Takes precedence over the endpoint ttl option.", "constantName": 
"org.apache.camel.component.statestore.StateStoreConstants#TTL" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "The value to store 
for put and putIfAbsent, as it is: a stream is stored as the stream and shared 
by the later gets, so convert it to text or bytes first. The other operations 
do not use the body" },
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"operation", "value": "contains", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value": "keys", "carriers": [ 
"list" ], "javaType": "java.util.Set<java.lang.String>" }, { "option": 
"operation", "value": "size", "carriers": [ "value" ], "javaType": 
"java.lang.Integer" }, { "option": "operation", "value": "clear", "carriers": [ 
"null" ] } ], "description": "By the operation, wh [...]
+  },
   "properties": {
     "storeName": { "index": 0, "kind": "path", "displayName": "Store Name", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The name of the state 
store" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": false, "type": 
"enum", "javaType": 
"org.apache.camel.component.statestore.StateStoreOperations", "enum": [ "put", 
"putIfAbsent", "get", "delete", "contains", "keys", "size", "clear" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
default operation to perform" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ignite-cache-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ignite-cache-component.adoc
index e0b507c40378..f25f4943ac2a 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ignite-cache-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ignite-cache-component.adoc
@@ -17,7 +17,8 @@
 The Ignite Cache endpoint is one of camel-ignite endpoints that allow you to 
interact with an https://apacheignite.readme.io/docs/data-grid[Ignite Cache].
 This offers both a Producer (to invoke cache operations on an Ignite cache) 
and a Consumer (to consume changes from a continuous query).
 
-The cache value is always the body of the message, whereas the cache key is 
always stored in the `CamelIgniteCacheKey` message header.
+The cache value is the body of the message, and the cache key is in the 
`CamelIgniteCacheKey` message header.
+GET and REMOVE take the key from the body when that header is not set, and a 
PUT of a `Map` body puts all its entries.
 
 Even if you configure a fixed operation in the endpoint URI, you can vary it 
per-exchange by setting the `CamelIgniteCacheOperation` message header.
 
diff --git 
a/components/camel-ehcache/src/generated/resources/META-INF/org/apache/camel/component/ehcache/ehcache.json
 
b/components/camel-ehcache/src/generated/resources/META-INF/org/apache/camel/component/ehcache/ehcache.json
index 57128105f2aa..64de7a9d7660 100644
--- 
a/components/camel-ehcache/src/generated/resources/META-INF/org/apache/camel/component/ehcache/ehcache.json
+++ 
b/components/camel-ehcache/src/generated/resources/META-INF/org/apache/camel/component/ehcache/ehcache.json
@@ -51,6 +51,11 @@
     "CamelEhcacheOldValue": { "index": 6, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "Object", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The old value associated to a key for actions like 
PUT_IF_ABSENT or the Object used for comparison for actions like REPLACE", 
"constantName": "org.apache.camel.component.ehcache.EhcacheConstants#OLD_VALUE" 
},
     "CamelEhcacheEventType": { "index": 7, "kind": "header", "displayName": 
"", "group": "common", "label": "", "required": false, "javaType": "EventType", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The type of event received", "constantName": 
"org.apache.camel.component.ehcache.EhcacheConstants#EVENT_TYPE" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "description": "The new value 
of the entry, as it was put, with the key in the CamelEhcacheKey header, the 
event in CamelEhcacheEventType and the previous value in CamelEhcacheOldValue. 
A REMOVED, EXPIRED or EVICTED event has no body" },
+    "producerIn": { "carriers": [ "any" ], "description": "The value to store 
for PUT, PUT_IF_ABSENT and REPLACE, converted to the valueType when set, and a 
Map of the entries for PUT_ALL, unless the CamelEhcacheValue header gives it. 
The value is stored as it is: a stream is read once, so convert it to text or 
bytes first. The other actions do not use the body" },
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"action", "value": "GET_ALL", "carriers": [ "map" ], "javaType": 
"java.util.Map" }, { "option": "action", "value": "PUT", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "PUT_ALL", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "PUT_IF_ABSENT", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "REPLACE", "carriers": [ 
"unchanged" ] }, { "option": "action", "value": "REMOVE", [...]
+  },
   "properties": {
     "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", 
"group": "common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "the cache name" },
     "cacheManager": { "index": 1, "kind": "parameter", "displayName": "Cache 
Manager", "group": "common", "label": "", "required": false, "type": "object", 
"javaType": "org.ehcache.CacheManager", "deprecated": false, "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.ehcache.EhcacheConfiguration", 
"configurationField": "configuration", "description": "The cache manager" },
diff --git 
a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheEndpoint.java
 
b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheEndpoint.java
index 20cf480f13fe..31e215004b6d 100644
--- 
a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheEndpoint.java
+++ 
b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheEndpoint.java
@@ -20,6 +20,9 @@ import org.apache.camel.Category;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -32,6 +35,35 @@ import org.apache.camel.support.service.ServiceHelper;
  */
 @UriEndpoint(firstVersion = "2.18.0", scheme = "ehcache", title = "Ehcache", 
syntax = "ehcache:cacheName",
              category = { Category.CACHE, Category.CLUSTERING }, headersClass 
= EhcacheConstants.class)
+@BodyTypes(consumerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   description = "The new value of the entry, 
as it was put, with the key in the CamelEhcacheKey"
+                                                 + " header, the event in 
CamelEhcacheEventType and the previous value in"
+                                                 + " CamelEhcacheOldValue. A 
REMOVED, EXPIRED or EVICTED event has no body"),
+           producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "The value to store for PUT, 
PUT_IF_ABSENT and REPLACE, converted to the"
+                                                + " valueType when set, and a 
Map of the entries for PUT_ALL, unless the"
+                                                + " CamelEhcacheValue header 
gives it. The value is stored as it is: a stream"
+                                                + " is read once, so convert 
it to text or bytes first. The other actions do"
+                                                + " not use the body"),
+           producerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   byOption = {
+                                           @BodyType.When(option = "action", 
value = "GET_ALL", carriers = Carrier.MAP,
+                                                          javaType = 
"java.util.Map"),
+                                           @BodyType.When(option = "action", 
value = "PUT", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "PUT_ALL", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "PUT_IF_ABSENT",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "REPLACE", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "REMOVE", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "REMOVE_ALL",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "CLEAR", carriers = Carrier.UNCHANGED) },
+                                   description = "By the action, which the 
CamelEhcacheAction header can set: the value of the"
+                                                 + " key for GET, or the body 
as it was when the key is not in the cache, and"
+                                                 + " for GET_ALL a Map of the 
keys in the CamelEhcacheKeys header to their"
+                                                 + " values, null for a key 
not found. The other actions keep the body;"
+                                                 + " PUT_IF_ABSENT and REPLACE 
put the previous value in the"
+                                                 + " CamelEhcacheOldValue 
header"))
 public class EhcacheEndpoint extends DefaultEndpoint {
     @UriPath(description = "the cache name")
     @Metadata(required = true)
diff --git 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/cache/ignite-cache.json
 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/cache/ignite-cache.json
index 6185c4786199..348cb48c6c01 100644
--- 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/cache/ignite-cache.json
+++ 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/cache/ignite-cache.json
@@ -40,6 +40,11 @@
     "CamelIgniteCacheName": { "index": 5, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "This header carries the cache name for which a 
continuous query event was received (consumer). It does not allow you to 
dynamically change the cache against which a producer operation is performed. 
Use EIPs for that (e.g. recipient l [...]
     "CamelIgniteCacheOldValue": { "index": 6, "kind": "header", "displayName": 
"", "group": "common", "label": "", "required": false, "javaType": "Object", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "(producer) The old cache value to be replaced when 
invoking the REPLACE operation. (consumer) This header carries the old cache 
value when passed in the incoming cache event.", "constantName": 
"org.apache.camel.component.ignite.IgniteConst [...]
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"oneExchangePerUpdate", "value": "false", "carriers": [ "list" ] }, { "option": 
"fireExistingQueryResults", "value": "true", "carriers": [ "unknown" ] } ], 
"description": "The new value of the cache entry that changed, with its key in 
the CamelIgniteCacheKey header, the old value in CamelIgniteCacheOldValue and 
the event type in CamelIgniteCacheEventType. With oneExchangePerUpdate=false a 
List of the CacheEntryEven [...]
+    "producerIn": { "carriers": [ "any" ], "description": "PUT and REPLACE 
store the body as the value of the key in the CamelIgniteCacheKey header, and a 
PUT of a Map puts all its entries; no body fails. GET and REMOVE take the key 
from that header, or else from the body, where a Set is several keys. QUERY 
needs an Ignite Query in the body or the CamelIgniteCacheQuery header. SIZE, 
CLEAR and REBALANCE do not use the body. The operation is the operation option 
or the CamelIgniteCacheOper [...]
+    "producerOut": { "carriers": [ "unknown" ], "dependsOn": [ 
"propagateIncomingBodyIfNoReturnValue" ], "byOption": [ { "option": 
"operation", "value": "PUT", "carriers": [ "unchanged", "null" ] }, { "option": 
"operation", "value": "REPLACE", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "REMOVE", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "CLEAR", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "REBALANCE", "carriers": [ "unchan [...]
+  },
   "properties": {
     "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", 
"group": "common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The cache name." },
     "propagateIncomingBodyIfNoReturnValue": { "index": 1, "kind": "parameter", 
"displayName": "Propagate Incoming Body If No Return Value", "group": "common", 
"label": "", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Sets whether to propagate the incoming body if the return type 
of the underlying Ignite operation is void." },
diff --git 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/compute/ignite-compute.json
 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/compute/ignite-compute.json
index eccaa68ab3f7..6e2bedb40a51 100644
--- 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/compute/ignite-compute.json
+++ 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/compute/ignite-compute.json
@@ -37,6 +37,10 @@
     "CamelIgniteComputeAffinityCacheName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Affinity cache name for the 
AFFINITY_CALL and AFFINITY_RUN operations.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_COMPUTE_AFFINITY_CACHE_NAME"
 },
     "CamelIgniteComputeAffinityKey": { "index": 4, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Affinity key for the AFFINITY_CALL and 
AFFINITY_RUN operations.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_COMPUTE_AFFINITY_KEY" 
}
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "pojo", "list" ], "dependsOn": [ "taskName" 
], "description": "The job to run on the cluster, by executionType: an 
IgniteCallable for CALL and AFFINITY_CALL, an IgniteRunnable for RUN and 
AFFINITY_RUN, a Collection of them for CALL and RUN, an IgniteCallable, 
IgniteRunnable or IgniteClosure for BROADCAST, an IgniteClosure for APPLY, and 
a ComputeTask or its Class for EXECUTE. Its parameters are in the 
CamelIgniteComputeParameters header. With taskName, E [...]
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"executionType", "value": "RUN", "carriers": [ "null" ] }, { "option": 
"executionType", "value": "AFFINITY_RUN", "carriers": [ "null" ] }, { "option": 
"executionType", "value": "BROADCAST", "carriers": [ "list", "null" ] } ], 
"description": "The result of the job. A Collection of callables, a broadcast 
and an APPLY of a Collection of parameters give a Collection of the results, 
unless an IgniteReducer in the CamelI [...]
+  },
   "properties": {
     "endpointId": { "index": 0, "kind": "path", "displayName": "Endpoint Id", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The endpoint ID (not 
used)." },
     "clusterGroupExpression": { "index": 1, "kind": "parameter", 
"displayName": "Cluster Group Expression", "group": "producer", "label": 
"producer", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.ignite.ClusterGroupExpression", "deprecated": 
false, "autowired": false, "secret": false, "description": "An expression that 
returns the Cluster Group for the IgniteCompute instance." },
diff --git 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/events/ignite-events.json
 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/events/ignite-events.json
index 74021fe55ba3..65d11dd6b9fd 100644
--- 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/events/ignite-events.json
+++ 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/events/ignite-events.json
@@ -30,6 +30,9 @@
     "igniteConfiguration": { "index": 3, "kind": "property", "displayName": 
"Ignite Configuration", "group": "consumer", "label": "", "required": false, 
"type": "object", "javaType": 
"org.apache.ignite.configuration.IgniteConfiguration", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows the user to set a 
programmatic ignite configuration." },
     "autowiredEnabled": { "index": 4, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "pojo" ], "javaType": 
"org.apache.ignite.events.Event", "description": "The Ignite Event, such as a 
CacheEvent or a JobEvent, with its type in type(); no headers are set. Ignite 
fires only the event types its configuration includes (includeEventTypes)" }
+  },
   "properties": {
     "endpointId": { "index": 0, "kind": "path", "displayName": "Endpoint Id", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The endpoint ID (not used)." },
     "clusterGroupExpression": { "index": 1, "kind": "parameter", 
"displayName": "Cluster Group Expression", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.ignite.ClusterGroupExpression", "deprecated": 
false, "autowired": false, "secret": false, "description": "The cluster group 
expression." },
diff --git 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/idgen/ignite-idgen.json
 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/idgen/ignite-idgen.json
index e3d3388e1a43..432245af793d 100644
--- 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/idgen/ignite-idgen.json
+++ 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/idgen/ignite-idgen.json
@@ -33,6 +33,10 @@
   "headers": {
     "CamelIgniteIdGenOperation": { "index": 0, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "org.apache.camel.component.ignite.idgen.IgniteIdGenOperation", 
"enum": [ "ADD_AND_GET", "GET", "GET_AND_ADD", "GET_AND_INCREMENT", 
"INCREMENT_AND_GET" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Allows you to dynamically change the ID 
Generator operation.", "constantName": "org [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "ADD_AND_GET", "carriers": [ "value", "text" ] }, { 
"option": "operation", "value": "GET_AND_ADD", "carriers": [ "value", "text" ] 
} ], "description": "ADD_AND_GET and GET_AND_ADD add the body to the sequence: 
a number, or text of one; no body fails. The other operations do not use the 
body, but text that is not a number still fails. The operation is the operation 
option or the CamelIgniteIdGenOper [...]
+    "producerOut": { "carriers": [ "value" ], "javaType": "java.lang.Long", 
"description": "The value of the sequence, as a Long" }
+  },
   "properties": {
     "name": { "index": 0, "kind": "path", "displayName": "Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The sequence name." },
     "batchSize": { "index": 1, "kind": "parameter", "displayName": "Batch 
Size", "group": "producer", "label": "producer", "required": false, "type": 
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": 
false, "secret": false, "description": "The batch size." },
diff --git 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/messaging/ignite-messaging.json
 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/messaging/ignite-messaging.json
index 641f44c6cff4..4be8d1517c78 100644
--- 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/messaging/ignite-messaging.json
+++ 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/messaging/ignite-messaging.json
@@ -35,6 +35,11 @@
     "CamelIgniteMessagingTopic": { "index": 0, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "(producer) Allows you to dynamically 
change the topic to send messages to. (consumer) It also carries the topic on 
which a message was received.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_MESSAGING_TOPIC" },
     "CamelIgniteMessagingUUID": { "index": 1, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.util.UUID", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "This header is filled in with the UUID 
of the subscription when a message arrives.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_MESSAGING_UUID" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "description": "The message as 
it was sent to the topic, with the topic in the CamelIgniteMessagingTopic 
header and the id of the subscription in CamelIgniteMessagingUUID" },
+    "producerIn": { "carriers": [ "text", "bytes", "value", "map", "list", 
"pojo" ], "description": "The message to send, as the object: it must be 
serializable for the other nodes, so a stream is not read. In UNORDERED mode a 
Collection is one message per element, unless 
treatCollectionsAsCacheObjects=true. No body fails. The topic is the 
CamelIgniteMessagingTopic header, or else the endpoint topic" },
+    "producerOut": { "carriers": [ "unchanged" ], "byOption": [ { "option": 
"propagateIncomingBodyIfNoReturnValue", "value": "false", "carriers": [ "null" 
] } ] }
+  },
   "properties": {
     "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": 
"common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The topic name." },
     "propagateIncomingBodyIfNoReturnValue": { "index": 1, "kind": "parameter", 
"displayName": "Propagate Incoming Body If No Return Value", "group": "common", 
"label": "", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Sets whether to propagate the incoming body if the return type 
of the underlying Ignite operation is void." },
diff --git 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/queue/ignite-queue.json
 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/queue/ignite-queue.json
index ba213e671e0f..cad10bfde3ea 100644
--- 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/queue/ignite-queue.json
+++ 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/queue/ignite-queue.json
@@ -36,6 +36,10 @@
     "CamelIgniteQueueTransferredCount": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The amount of items transferred as the 
result of the DRAIN operation.", "constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_QUEUE_TRANSFERRED_COUNT"
 },
     "CamelIgniteQueueTimeoutMillis": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Dynamically sets the timeout in 
milliseconds to use when invoking the OFFER or POLL operations.", 
"constantName": 
"org.apache.camel.component.ignite.IgniteConstants#IGNITE_QUEUE_TIMEOUT_MILLIS" 
}
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "ADD, OFFER, PUT, 
CONTAINS, REMOVE and RETAIN_ALL use the body as the element, and a Collection 
as several elements unless treatCollectionsAsCacheObjects=true; no body fails 
ADD, CONTAINS, REMOVE and RETAIN_ALL. DRAIN drains into a Collection body, or a 
new List. The other operations do not use the body. The operation is the 
operation option or the CamelIgniteQueueOperation header; with neither the 
producer fails" },
+    "producerOut": { "carriers": [ "unknown" ], "dependsOn": [ 
"propagateIncomingBodyIfNoReturnValue" ], "byOption": [ { "option": 
"operation", "value": "ADD", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value": "OFFER", "carriers": [ 
"value" ], "javaType": "java.lang.Boolean" }, { "option": "operation", "value": 
"CONTAINS", "carriers": [ "value" ], "javaType": "java.lang.Boolean" }, { 
"option": "operation", "value": "REMOVE", "carriers": [ "valu [...]
+  },
   "properties": {
     "name": { "index": 0, "kind": "path", "displayName": "Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The queue name." },
     "capacity": { "index": 1, "kind": "parameter", "displayName": "Capacity", 
"group": "producer", "label": "producer", "required": false, "type": "integer", 
"javaType": "int", "deprecated": false, "autowired": false, "secret": false, 
"description": "The queue capacity. Default: non-bounded." },
diff --git 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/set/ignite-set.json
 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/set/ignite-set.json
index 61ab5f886eec..d1b61c964302 100644
--- 
a/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/set/ignite-set.json
+++ 
b/components/camel-ignite/src/generated/resources/META-INF/org/apache/camel/component/ignite/set/ignite-set.json
@@ -33,6 +33,10 @@
   "headers": {
     "CamelIgniteSetsOperation": { "index": 0, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"org.apache.camel.component.ignite.set.IgniteSetOperation", "enum": [ 
"CONTAINS", "ADD", "SIZE", "REMOVE", "ITERATOR", "CLEAR", "RETAIN_ALL", "ARRAY" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Allows you to dynamically change the set operation.", 
"constantName": "org.apache.came [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "ADD, CONTAINS, 
REMOVE and RETAIN_ALL use the body as the element, and a Collection as several 
elements unless treatCollectionsAsCacheObjects=true; no body fails them. SIZE, 
ITERATOR, ARRAY and CLEAR do not use the body. The operation is the operation 
option or the CamelIgniteSetsOperation header; with neither the producer fails" 
},
+    "producerOut": { "carriers": [ "value", "iterator", "list", "unchanged" ], 
"dependsOn": [ "propagateIncomingBodyIfNoReturnValue" ], "byOption": [ { 
"option": "operation", "value": "ADD", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value": "CONTAINS", 
"carriers": [ "value" ], "javaType": "java.lang.Boolean" }, { "option": 
"operation", "value": "REMOVE", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value [...]
+  },
   "properties": {
     "name": { "index": 0, "kind": "path", "displayName": "Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The set name." },
     "configuration": { "index": 1, "kind": "parameter", "displayName": 
"Configuration", "group": "producer", "label": "producer", "required": false, 
"type": "object", "javaType": 
"org.apache.ignite.configuration.CollectionConfiguration", "deprecated": false, 
"autowired": false, "secret": false, "description": "The collection 
configuration. Default: empty configuration. You can also conveniently set 
inner properties by using configuration.xyz=123 options." },
diff --git a/components/camel-ignite/src/main/docs/ignite-cache-component.adoc 
b/components/camel-ignite/src/main/docs/ignite-cache-component.adoc
index e0b507c40378..f25f4943ac2a 100644
--- a/components/camel-ignite/src/main/docs/ignite-cache-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-cache-component.adoc
@@ -17,7 +17,8 @@
 The Ignite Cache endpoint is one of camel-ignite endpoints that allow you to 
interact with an https://apacheignite.readme.io/docs/data-grid[Ignite Cache].
 This offers both a Producer (to invoke cache operations on an Ignite cache) 
and a Consumer (to consume changes from a continuous query).
 
-The cache value is always the body of the message, whereas the cache key is 
always stored in the `CamelIgniteCacheKey` message header.
+The cache value is the body of the message, and the cache key is in the 
`CamelIgniteCacheKey` message header.
+GET and REMOVE take the key from the body when that header is not set, and a 
PUT of a `Map` body puts all its entries.
 
 Even if you configure a fixed operation in the endpoint URI, you can vary it 
per-exchange by setting the `CamelIgniteCacheOperation` message header.
 
diff --git 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/cache/IgniteCacheEndpoint.java
 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/cache/IgniteCacheEndpoint.java
index cabfc895dd81..2bff9c98b559 100644
--- 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/cache/IgniteCacheEndpoint.java
+++ 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/cache/IgniteCacheEndpoint.java
@@ -27,6 +27,9 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.ignite.AbstractIgniteEndpoint;
 import org.apache.camel.component.ignite.IgniteConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -44,6 +47,48 @@ import static 
org.apache.camel.component.ignite.IgniteConstants.SCHEME_CACHE;
  */
 @UriEndpoint(firstVersion = "2.17.0", scheme = SCHEME_CACHE, title = "Ignite 
Cache", syntax = "ignite-cache:cacheName",
              category = { Category.CACHE, Category.CLUSTERING }, headersClass 
= IgniteConstants.class)
+@BodyTypes(consumerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   byOption = {
+                                           @BodyType.When(option = 
"oneExchangePerUpdate", value = "false",
+                                                          carriers = 
Carrier.LIST),
+                                           @BodyType.When(option = 
"fireExistingQueryResults", value = "true",
+                                                          carriers = 
Carrier.UNKNOWN) },
+                                   description = "The new value of the cache 
entry that changed, with its key in the"
+                                                 + " CamelIgniteCacheKey 
header, the old value in CamelIgniteCacheOldValue and"
+                                                 + " the event type in 
CamelIgniteCacheEventType. With oneExchangePerUpdate=false"
+                                                 + " a List of the 
CacheEntryEvents of Ignite per batch; with"
+                                                 + " 
fireExistingQueryResults=true the entries the initial query finds come"
+                                                 + " first, each as a JCache 
Cache.Entry"),
+           producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "PUT and REPLACE store the 
body as the value of the key in the"
+                                                + " CamelIgniteCacheKey 
header, and a PUT of a Map puts all its entries; no"
+                                                + " body fails. GET and REMOVE 
take the key from that header, or else from the"
+                                                + " body, where a Set is 
several keys. QUERY needs an Ignite Query in the body"
+                                                + " or the 
CamelIgniteCacheQuery header. SIZE, CLEAR and REBALANCE do not use"
+                                                + " the body. The operation is 
the operation option or the"
+                                                + " CamelIgniteCacheOperation 
header; with neither the producer fails"),
+           producerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   dependsOn = 
"propagateIncomingBodyIfNoReturnValue",
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "PUT",
+                                                          carriers = { 
Carrier.UNCHANGED, Carrier.NULL }),
+                                           @BodyType.When(option = 
"operation", value = "REPLACE",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "REMOVE",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "CLEAR",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "REBALANCE",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "SIZE", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Integer"),
+                                           @BodyType.When(option = 
"operation", value = "QUERY",
+                                                          carriers = 
Carrier.ITERATOR) },
+                                   description = "GET gives the cached value, 
or null when the key is not cached, and a Map"
+                                                 + " of the keys and their 
values for a Set of keys. QUERY gives an Iterator of"
+                                                 + " the entries found, closed 
when the exchange completes. SIZE gives the"
+                                                 + " number of entries. The 
others leave the body, but a PUT of a Map leaves no"
+                                                 + " body"))
 public class IgniteCacheEndpoint extends AbstractIgniteEndpoint {
 
     @UriPath
diff --git 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/compute/IgniteComputeEndpoint.java
 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/compute/IgniteComputeEndpoint.java
index e59f60a867e6..136adea0c895 100644
--- 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/compute/IgniteComputeEndpoint.java
+++ 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/compute/IgniteComputeEndpoint.java
@@ -25,6 +25,9 @@ import org.apache.camel.Producer;
 import org.apache.camel.component.ignite.AbstractIgniteEndpoint;
 import org.apache.camel.component.ignite.ClusterGroupExpression;
 import org.apache.camel.component.ignite.IgniteConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -42,6 +45,25 @@ import static 
org.apache.camel.component.ignite.IgniteConstants.SCHEME_COMPUTE;
  */
 @UriEndpoint(firstVersion = "2.17.0", scheme = SCHEME_COMPUTE, title = "Ignite 
Compute", syntax = "ignite-compute:endpointId",
              category = { Category.CACHE, Category.CLUSTERING }, producerOnly 
= true, headersClass = IgniteConstants.class)
+@BodyTypes(producerIn = @BodyType(value = { Carrier.POJO, Carrier.LIST }, 
dependsOn = "taskName",
+                                  description = "The job to run on the 
cluster, by executionType: an IgniteCallable for CALL"
+                                                + " and AFFINITY_CALL, an 
IgniteRunnable for RUN and AFFINITY_RUN, a Collection"
+                                                + " of them for CALL and RUN, 
an IgniteCallable, IgniteRunnable or"
+                                                + " IgniteClosure for 
BROADCAST, an IgniteClosure for APPLY, and a ComputeTask or"
+                                                + " its Class for EXECUTE. Its 
parameters are in the CamelIgniteComputeParameters"
+                                                + " header. With taskName, 
EXECUTE runs that task with the body as its"
+                                                + " argument. Text or no body 
fails"),
+           producerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   byOption = {
+                                           @BodyType.When(option = 
"executionType", value = "RUN", carriers = Carrier.NULL),
+                                           @BodyType.When(option = 
"executionType", value = "AFFINITY_RUN",
+                                                          carriers = 
Carrier.NULL),
+                                           @BodyType.When(option = 
"executionType", value = "BROADCAST",
+                                                          carriers = { 
Carrier.LIST, Carrier.NULL }) },
+                                   description = "The result of the job. A 
Collection of callables, a broadcast and an APPLY"
+                                                 + " of a Collection of 
parameters give a Collection of the results, unless an"
+                                                 + " IgniteReducer in the 
CamelIgniteComputeReducer header reduces them. RUN,"
+                                                 + " AFFINITY_RUN and a 
broadcast IgniteRunnable leave no body"))
 public class IgniteComputeEndpoint extends AbstractIgniteEndpoint {
 
     @UriPath
diff --git 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/events/IgniteEventsEndpoint.java
 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/events/IgniteEventsEndpoint.java
index 25a36223289e..5ec0a2eeb8d2 100644
--- 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/events/IgniteEventsEndpoint.java
+++ 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/events/IgniteEventsEndpoint.java
@@ -30,6 +30,9 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.ignite.AbstractIgniteEndpoint;
 import org.apache.camel.component.ignite.ClusterGroupExpression;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
@@ -52,6 +55,10 @@ import static 
org.apache.camel.component.ignite.IgniteConstants.SCHEME_EVENTS;
 @UriEndpoint(firstVersion = "2.17.0", scheme = SCHEME_EVENTS, title = "Ignite 
Events", syntax = "ignite-events:endpointId",
              category = { Category.MESSAGING, Category.CACHE, 
Category.CLUSTERING },
              consumerOnly = true)
+@BodyTypes(consumerOut = @BodyType(value = Carrier.POJO, javaType = 
"org.apache.ignite.events.Event",
+                                   description = "The Ignite Event, such as a 
CacheEvent or a JobEvent, with its type in"
+                                                 + " type(); no headers are 
set. Ignite fires only the event types its"
+                                                 + " configuration includes 
(includeEventTypes)"))
 public class IgniteEventsEndpoint extends AbstractIgniteEndpoint {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(IgniteEventsEndpoint.class);
diff --git 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/idgen/IgniteIdGenEndpoint.java
 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/idgen/IgniteIdGenEndpoint.java
index db6f9ff5fd23..0e739c296af6 100644
--- 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/idgen/IgniteIdGenEndpoint.java
+++ 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/idgen/IgniteIdGenEndpoint.java
@@ -24,6 +24,9 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.ignite.AbstractIgniteEndpoint;
 import org.apache.camel.component.ignite.IgniteConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -43,6 +46,18 @@ import static 
org.apache.camel.component.ignite.IgniteConstants.SCHEME_IDGEN;
  */
 @UriEndpoint(firstVersion = "2.17.0", scheme = SCHEME_IDGEN, title = "Ignite 
ID Generator", syntax = "ignite-idgen:name",
              category = { Category.CACHE, Category.CLUSTERING }, producerOnly 
= true, headersClass = IgniteConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = {
+                                          @BodyType.When(option = "operation", 
value = "ADD_AND_GET",
+                                                         carriers = { 
Carrier.VALUE, Carrier.TEXT }),
+                                          @BodyType.When(option = "operation", 
value = "GET_AND_ADD",
+                                                         carriers = { 
Carrier.VALUE, Carrier.TEXT }) },
+                                  description = "ADD_AND_GET and GET_AND_ADD 
add the body to the sequence: a number, or text"
+                                                + " of one; no body fails. The 
other operations do not use the body, but text"
+                                                + " that is not a number still 
fails. The operation is the operation option or"
+                                                + " the 
CamelIgniteIdGenOperation header"),
+           producerOut = @BodyType(value = Carrier.VALUE, javaType = 
"java.lang.Long",
+                                   description = "The value of the sequence, 
as a Long"))
 public class IgniteIdGenEndpoint extends AbstractIgniteEndpoint {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(IgniteIdGenEndpoint.class);
diff --git 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/messaging/IgniteMessagingEndpoint.java
 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/messaging/IgniteMessagingEndpoint.java
index 8104b9257574..6424f82bda45 100644
--- 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/messaging/IgniteMessagingEndpoint.java
+++ 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/messaging/IgniteMessagingEndpoint.java
@@ -25,6 +25,9 @@ import org.apache.camel.Producer;
 import org.apache.camel.component.ignite.AbstractIgniteEndpoint;
 import org.apache.camel.component.ignite.ClusterGroupExpression;
 import org.apache.camel.component.ignite.IgniteConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -41,6 +44,19 @@ import static 
org.apache.camel.component.ignite.IgniteConstants.SCHEME_MESSAGING
  */
 @UriEndpoint(firstVersion = "2.17.0", scheme = SCHEME_MESSAGING, title = 
"Ignite Messaging",
              syntax = "ignite-messaging:topic", category = { 
Category.MESSAGING }, headersClass = IgniteConstants.class)
+@BodyTypes(consumerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   description = "The message as it was sent 
to the topic, with the topic in the"
+                                                 + " CamelIgniteMessagingTopic 
header and the id of the subscription in"
+                                                 + " 
CamelIgniteMessagingUUID"),
+           producerIn = @BodyType(value = {
+                   Carrier.TEXT, Carrier.BYTES, Carrier.VALUE, Carrier.MAP, 
Carrier.LIST, Carrier.POJO },
+                                  description = "The message to send, as the 
object: it must be serializable for the other"
+                                                + " nodes, so a stream is not 
read. In UNORDERED mode a Collection is one message"
+                                                + " per element, unless 
treatCollectionsAsCacheObjects=true. No body fails. The"
+                                                + " topic is the 
CamelIgniteMessagingTopic header, or else the endpoint topic"),
+           producerOut = @BodyType(value = Carrier.UNCHANGED,
+                                   byOption = @BodyType.When(option = 
"propagateIncomingBodyIfNoReturnValue", value = "false",
+                                                             carriers = 
Carrier.NULL)))
 public class IgniteMessagingEndpoint extends AbstractIgniteEndpoint {
 
     @UriPath
diff --git 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/queue/IgniteQueueEndpoint.java
 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/queue/IgniteQueueEndpoint.java
index b708a47f881e..3a896246cba9 100644
--- 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/queue/IgniteQueueEndpoint.java
+++ 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/queue/IgniteQueueEndpoint.java
@@ -24,6 +24,9 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.ignite.AbstractIgniteEndpoint;
 import org.apache.camel.component.ignite.IgniteConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -44,6 +47,41 @@ import static 
org.apache.camel.component.ignite.IgniteConstants.SCHEME_QUEUE;
 @UriEndpoint(firstVersion = "2.17.0", scheme = SCHEME_QUEUE, title = "Ignite 
Queues", syntax = "ignite-queue:name",
              category = { Category.CACHE, Category.CLUSTERING, 
Category.MESSAGING }, producerOnly = true,
              headersClass = IgniteConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "ADD, OFFER, PUT, CONTAINS, 
REMOVE and RETAIN_ALL use the body as the"
+                                                + " element, and a Collection 
as several elements unless"
+                                                + " 
treatCollectionsAsCacheObjects=true; no body fails ADD, CONTAINS, REMOVE"
+                                                + " and RETAIN_ALL. DRAIN 
drains into a Collection body, or a new List. The"
+                                                + " other operations do not 
use the body. The operation is the operation option"
+                                                + " or the 
CamelIgniteQueueOperation header; with neither the producer fails"),
+           producerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   dependsOn = 
"propagateIncomingBodyIfNoReturnValue",
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "ADD", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "OFFER", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "CONTAINS", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "REMOVE", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "RETAIN_ALL",
+                                                          carriers = 
Carrier.VALUE, javaType = "java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "SIZE", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Integer"),
+                                           @BodyType.When(option = 
"operation", value = "ITERATOR",
+                                                          carriers = 
Carrier.ITERATOR),
+                                           @BodyType.When(option = 
"operation", value = "ARRAY", carriers = Carrier.LIST),
+                                           @BodyType.When(option = 
"operation", value = "DRAIN", carriers = Carrier.LIST),
+                                           @BodyType.When(option = 
"operation", value = "CLEAR",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "PUT", carriers = Carrier.UNCHANGED) },
+                                   description = "true or false for ADD, 
OFFER, CONTAINS, REMOVE and RETAIN_ALL, the number of"
+                                                 + " elements for SIZE, an 
Iterator for ITERATOR, an Object array for ARRAY, and"
+                                                 + " the Collection of the 
drained elements for DRAIN, with their count in the"
+                                                 + " 
CamelIgniteQueueTransferredCount header. ELEMENT, TAKE, PEEK and POLL give"
+                                                 + " the head element; PEEK 
and POLL give null for an empty queue. CLEAR and PUT"
+                                                 + " leave the body"))
 public class IgniteQueueEndpoint extends AbstractIgniteEndpoint {
 
     @UriPath
diff --git 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/set/IgniteSetEndpoint.java
 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/set/IgniteSetEndpoint.java
index f45e630bacbb..00302a6873e9 100644
--- 
a/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/set/IgniteSetEndpoint.java
+++ 
b/components/camel-ignite/src/main/java/org/apache/camel/component/ignite/set/IgniteSetEndpoint.java
@@ -24,6 +24,9 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.ignite.AbstractIgniteEndpoint;
 import org.apache.camel.component.ignite.IgniteConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -41,6 +44,34 @@ import static 
org.apache.camel.component.ignite.IgniteConstants.SCHEME_SET;
  */
 @UriEndpoint(firstVersion = "2.17.0", scheme = SCHEME_SET, title = "Ignite 
Sets", syntax = "ignite-set:name",
              category = { Category.CACHE, Category.CLUSTERING }, producerOnly 
= true, headersClass = IgniteConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "ADD, CONTAINS, REMOVE and 
RETAIN_ALL use the body as the element, and a"
+                                                + " Collection as several 
elements unless treatCollectionsAsCacheObjects=true; no"
+                                                + " body fails them. SIZE, 
ITERATOR, ARRAY and CLEAR do not use the body. The"
+                                                + " operation is the operation 
option or the CamelIgniteSetsOperation header;"
+                                                + " with neither the producer 
fails"),
+           producerOut = @BodyType(value = { Carrier.VALUE, Carrier.ITERATOR, 
Carrier.LIST, Carrier.UNCHANGED },
+                                   dependsOn = 
"propagateIncomingBodyIfNoReturnValue",
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "ADD", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "CONTAINS", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "REMOVE", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "RETAIN_ALL",
+                                                          carriers = 
Carrier.VALUE, javaType = "java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "SIZE", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Integer"),
+                                           @BodyType.When(option = 
"operation", value = "ITERATOR",
+                                                          carriers = 
Carrier.ITERATOR),
+                                           @BodyType.When(option = 
"operation", value = "ARRAY", carriers = Carrier.LIST),
+                                           @BodyType.When(option = 
"operation", value = "CLEAR",
+                                                          carriers = 
Carrier.UNCHANGED) },
+                                   description = "true or false for ADD, 
CONTAINS, REMOVE and RETAIN_ALL (whether the set"
+                                                 + " changed, or holds the 
element), the number of elements for SIZE, an"
+                                                 + " Iterator for ITERATOR and 
an Object array for ARRAY. CLEAR leaves the"
+                                                 + " body"))
 public class IgniteSetEndpoint extends AbstractIgniteEndpoint {
 
     @UriPath
diff --git 
a/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json
 
b/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json
index a45226ae5024..45984af75d51 100644
--- 
a/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json
+++ 
b/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json
@@ -43,6 +43,11 @@
     "CamelJCacheEntryProcessor": { "index": 6, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "EntryProcessor<Object, Object, Object>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
EntryProcessor to invoke", "constantName": 
"org.apache.camel.component.jcache.JCacheConstants#ENTRY_PROCESSOR" },
     "CamelJCacheEntryArgs": { "index": 7, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"Collection<Object>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The additional arguments to pass to the 
EntryProcessor", "constantName": 
"org.apache.camel.component.jcache.JCacheConstants#ARGUMENTS" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "unknown" ], "description": "The value of 
the entry, as it was put, with the key in the CamelJCacheKey header and the 
event (CREATED, UPDATED, REMOVED or EXPIRED) in CamelJCacheEventType; with 
oldValueRequired the previous value is in the CamelJCacheOldValue header. A 
REMOVED or EXPIRED event has the old value as body when the provider gives it 
(Hazelcast does with oldValueRequired), else no body" },
+    "producerIn": { "carriers": [ "any" ], "description": "The value to store 
for PUT, PUTIFABSENT, REPLACE, GETANDPUT and GETANDREPLACE, as it is, and a Map 
of the entries for PUTALL; no body, or a body that is not a Map for PUTALL, 
fails. A provider that stores by value serializes it: a stream fails, so 
convert it to text or bytes first. The other actions do not use the body" },
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"action", "value": "GETALL", "carriers": [ "map" ], "javaType": "java.util.Map" 
}, { "option": "action", "value": "PUT", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "PUTALL", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "PUTIFABSENT", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "REPLACE", "carriers": [ "unchanged" ] }, { 
"option": "action", "value": "REMOVE", "ca [...]
+  },
   "properties": {
     "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", 
"group": "common", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The name of the cache" },
     "cacheConfigurationProperties": { "index": 1, "kind": "parameter", 
"displayName": "Cache Configuration Properties", "group": "common", "label": 
"", "required": false, "type": "object", "javaType": "java.util.Properties", 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": 
"configuration", "description": "The Properties for the 
javax.cache.spi.CachingProvider to create the CacheM [...]
diff --git 
a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheEndpoint.java
 
b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheEndpoint.java
index dc2139dc7452..51fe61e6f562 100644
--- 
a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheEndpoint.java
+++ 
b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheEndpoint.java
@@ -20,6 +20,9 @@ import org.apache.camel.Category;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -31,6 +34,39 @@ import org.apache.camel.support.DefaultEndpoint;
  */
 @UriEndpoint(firstVersion = "2.17.0", scheme = "jcache", title = "JCache", 
syntax = "jcache:cacheName",
              category = { Category.CACHE, Category.CLUSTERING }, headersClass 
= JCacheConstants.class)
+@BodyTypes(consumerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   description = "The value of the entry, as 
it was put, with the key in the CamelJCacheKey"
+                                                 + " header and the event 
(CREATED, UPDATED, REMOVED or EXPIRED) in"
+                                                 + " CamelJCacheEventType; 
with oldValueRequired the previous value is in the"
+                                                 + " CamelJCacheOldValue 
header. A REMOVED or EXPIRED event has the old value as"
+                                                 + " body when the provider 
gives it (Hazelcast does with oldValueRequired),"
+                                                 + " else no body"),
+           producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "The value to store for PUT, 
PUTIFABSENT, REPLACE, GETANDPUT and GETANDREPLACE,"
+                                                + " as it is, and a Map of the 
entries for PUTALL; no body, or a body that is"
+                                                + " not a Map for PUTALL, 
fails. A provider that stores by value serializes it:"
+                                                + " a stream fails, so convert 
it to text or bytes first. The other actions do"
+                                                + " not use the body"),
+           producerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   byOption = {
+                                           @BodyType.When(option = "action", 
value = "GETALL", carriers = Carrier.MAP,
+                                                          javaType = 
"java.util.Map"),
+                                           @BodyType.When(option = "action", 
value = "PUT", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "PUTALL", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "PUTIFABSENT",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "REPLACE", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "REMOVE", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "REMOVEALL",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = "action", 
value = "CLEAR", carriers = Carrier.UNCHANGED) },
+                                   description = "By the action, which the 
CamelJCacheAction header can set: the value of the"
+                                                 + " key for GET, or no body 
when it is not in the cache; the previous value,"
+                                                 + " or no body, for 
GETANDPUT, GETANDREPLACE and GETANDREMOVE; a Map of the"
+                                                 + " keys found to their 
values for GETALL; the result of the EntryProcessor"
+                                                 + " for INVOKE, a Map of the 
keys to their EntryProcessorResult with"
+                                                 + " CamelJCacheKeys. The 
other actions keep the body; PUTIFABSENT, REPLACE and"
+                                                 + " REMOVE put whether they 
changed the cache in the CamelJCacheResult header"))
 public class JCacheEndpoint extends DefaultEndpoint {
 
     @UriPath(description = "The name of the cache")
diff --git 
a/components/camel-state-store/camel-state-store/src/generated/resources/META-INF/org/apache/camel/component/statestore/state-store.json
 
b/components/camel-state-store/camel-state-store/src/generated/resources/META-INF/org/apache/camel/component/statestore/state-store.json
index 47d003a36392..807a43c79cb4 100644
--- 
a/components/camel-state-store/camel-state-store/src/generated/resources/META-INF/org/apache/camel/component/statestore/state-store.json
+++ 
b/components/camel-state-store/camel-state-store/src/generated/resources/META-INF/org/apache/camel/component/statestore/state-store.json
@@ -33,6 +33,10 @@
     "CamelStateStoreKey": { "index": 1, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The key to use for the operation", 
"constantName": "org.apache.camel.component.statestore.StateStoreConstants#KEY" 
},
     "CamelStateStoreTtl": { "index": 2, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"Long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Per-message TTL override in milliseconds. 
Takes precedence over the endpoint ttl option.", "constantName": 
"org.apache.camel.component.statestore.StateStoreConstants#TTL" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "The value to store 
for put and putIfAbsent, as it is: a stream is stored as the stream and shared 
by the later gets, so convert it to text or bytes first. The other operations 
do not use the body" },
+    "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": 
"operation", "value": "contains", "carriers": [ "value" ], "javaType": 
"java.lang.Boolean" }, { "option": "operation", "value": "keys", "carriers": [ 
"list" ], "javaType": "java.util.Set<java.lang.String>" }, { "option": 
"operation", "value": "size", "carriers": [ "value" ], "javaType": 
"java.lang.Integer" }, { "option": "operation", "value": "clear", "carriers": [ 
"null" ] } ], "description": "By the operation, wh [...]
+  },
   "properties": {
     "storeName": { "index": 0, "kind": "path", "displayName": "Store Name", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The name of the state 
store" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": false, "type": 
"enum", "javaType": 
"org.apache.camel.component.statestore.StateStoreOperations", "enum": [ "put", 
"putIfAbsent", "get", "delete", "contains", "keys", "size", "clear" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
default operation to perform" },
diff --git 
a/components/camel-state-store/camel-state-store/src/main/java/org/apache/camel/component/statestore/StateStoreEndpoint.java
 
b/components/camel-state-store/camel-state-store/src/main/java/org/apache/camel/component/statestore/StateStoreEndpoint.java
index 62747afce2e9..90a855cce895 100644
--- 
a/components/camel-state-store/camel-state-store/src/main/java/org/apache/camel/component/statestore/StateStoreEndpoint.java
+++ 
b/components/camel-state-store/camel-state-store/src/main/java/org/apache/camel/component/statestore/StateStoreEndpoint.java
@@ -20,6 +20,9 @@ import org.apache.camel.Category;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.KeyValueRepository;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
@@ -36,6 +39,25 @@ import org.apache.camel.support.DefaultEndpoint;
              syntax = "state-store:storeName", producerOnly = true,
              category = { Category.CACHE },
              headersClass = StateStoreConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "The value to store for put 
and putIfAbsent, as it is: a stream is stored as"
+                                                + " the stream and shared by 
the later gets, so convert it to text or bytes"
+                                                + " first. The other 
operations do not use the body"),
+           producerOut = @BodyType(value = Carrier.UNKNOWN,
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "contains", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "keys", carriers = Carrier.LIST,
+                                                          javaType = 
"java.util.Set<java.lang.String>"),
+                                           @BodyType.When(option = 
"operation", value = "size", carriers = Carrier.VALUE,
+                                                          javaType = 
"java.lang.Integer"),
+                                           @BodyType.When(option = 
"operation", value = "clear", carriers = Carrier.NULL) },
+                                   description = "By the operation, which the 
CamelStateStoreOperation header can set: the"
+                                                 + " stored value for get, the 
previous value for put, the value already there"
+                                                 + " for putIfAbsent and the 
removed value for delete, each no body when there"
+                                                 + " is none; a Boolean for 
contains, the Set of the keys for keys, the count"
+                                                 + " for size and no body for 
clear. The value is the object the backend gives"
+                                                 + " back: the in-memory one 
the object stored, another may give a copy"))
 public class StateStoreEndpoint extends DefaultEndpoint {
 
     @UriPath(description = "The name of the state store")

Reply via email to