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


The following commit(s) were added to refs/heads/main by this push:
     new ffe0255463d5 CAMEL-24961: Catalog body types for Athena, S3 Vectors, 
Step Functions and eight more AWS components (#28343)
ffe0255463d5 is described below

commit ffe0255463d59c90e4f7d279a4fcbee93b0cb097
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Oct 24 10:21:33 2026 +0200

    CAMEL-24961: Catalog body types for Athena, S3 Vectors, Step Functions and 
eight more AWS components (#28343)
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
---
 .../camel/catalog/components/aws-config.json       |  4 ++
 .../camel/catalog/components/aws-security-hub.json |  4 ++
 .../camel/catalog/components/aws2-athena.json      |  4 ++
 .../apache/camel/catalog/components/aws2-ecs.json  |  4 ++
 .../apache/camel/catalog/components/aws2-eks.json  |  4 ++
 .../apache/camel/catalog/components/aws2-mq.json   |  4 ++
 .../apache/camel/catalog/components/aws2-msk.json  |  4 ++
 .../catalog/components/aws2-redshift-data.json     |  4 ++
 .../camel/catalog/components/aws2-s3-vectors.json  |  5 ++
 .../catalog/components/aws2-step-functions.json    |  4 ++
 .../camel/catalog/docs/aws2-athena-component.adoc  | 30 ++++++-----
 .../camel/component/aws/config/aws-config.json     |  4 ++
 .../component/aws/config/AWSConfigEndpoint.java    | 16 ++++++
 .../aws/parameterstore/aws-parameter-store.json    |  4 ++
 .../aws/parameterstore/ParameterStoreEndpoint.java | 21 ++++++++
 .../aws/securityhub/aws-security-hub.json          |  4 ++
 .../aws/securityhub/SecurityHubEndpoint.java       | 19 +++++++
 .../camel/component/aws2/athena/aws2-athena.json   |  4 ++
 .../src/main/docs/aws2-athena-component.adoc       | 30 ++++++-----
 .../component/aws2/athena/Athena2Endpoint.java     | 27 ++++++++++
 .../apache/camel/component/aws2/ecs/aws2-ecs.json  |  4 ++
 .../camel/component/aws2/ecs/ECS2Endpoint.java     | 14 +++++
 .../apache/camel/component/aws2/eks/aws2-eks.json  |  4 ++
 .../camel/component/aws2/eks/EKS2Endpoint.java     | 13 +++++
 .../apache/camel/component/aws2/mq/aws2-mq.json    |  4 ++
 .../camel/component/aws2/mq/MQ2Endpoint.java       | 13 +++++
 .../apache/camel/component/aws2/msk/aws2-msk.json  |  4 ++
 .../camel/component/aws2/msk/MSK2Endpoint.java     | 13 +++++
 .../aws2/redshift/data/aws2-redshift-data.json     |  4 ++
 .../aws2/redshift/data/RedshiftData2Endpoint.java  | 14 +++++
 .../component/aws2/s3vectors/aws2-s3-vectors.json  |  5 ++
 .../aws2/s3vectors/AWS2S3VectorsEndpoint.java      | 34 ++++++++++++
 .../aws2/stepfunctions/aws2-step-functions.json    |  4 ++
 .../aws2/stepfunctions/StepFunctions2Endpoint.java | 16 ++++++
 .../camel/dsl/yaml/validator/TextBodyFlowTest.java | 62 ++++++++++++++++++++++
 35 files changed, 384 insertions(+), 24 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json
index c9b79f9de9fd..7ed9e9726c47 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json
@@ -56,6 +56,10 @@
     "CamelAwsConfigConformacePackS3TemplateURI": { "index": 5, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The location of the file 
containing the template body in S3", "constantName": 
"org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_S3_TEMPLATE_URI"
 },
     "CamelAwsConfigConformacePackTemplateBody": { "index": 6, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "A string containing the 
full conformance pack template body", "constantName": 
"org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_TEMPLATE_BODY"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the rule of 
putConfigRule in CamelAwsConfigRuleName, CamelAwsConfigRuleSource and 
CamelAwsConfigRuleSourceIdentifier, and the template of putConformancePack in 
CamelAwsConfigConformacePackTemplateBody. With pojoRequest=true the request of 
the AWS SDK for the operation, such as a Put [...]
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the 
DescribeComplianceByConfigRuleResponse of describeRuleCompliance, or the 
PutConformancePackResponse with the ARN of the pack. putConfigRule, 
removeConfigRule and removeConformancePack give an empty response" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws.config.AWSConfigConfiguration", 
"configurationField": "configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws.config.AWSConfigOperations", "enum": [ 
"putConfigRule", "removeConfigRule", "describeRuleCompliance", 
"putConformancePack", "removeConformancePack" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.aws.config.AWSConf [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json
index c550f5a64599..46894fe3a2ce 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json
@@ -71,6 +71,10 @@
     "CamelAwsSecurityHubProductArn": { "index": 20, "kind": "header", 
"displayName": "", "group": "getFindingHistory", "label": "getFindingHistory", 
"required": false, "javaType": "String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
product ARN for the finding", "constantName": 
"org.apache.camel.component.aws.securityhub.SecurityHubConstants#PRODUCT_ARN" },
     "CamelAwsSecurityHubFindingAggregatorArn": { "index": 21, "kind": 
"header", "displayName": "", "group": "getFindingAggregator", "label": 
"getFindingAggregator", "required": false, "javaType": "String", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "The ARN of the finding aggregator to retrieve", "constantName": 
"org.apache.camel.component.aws.securityhub.SecurityHubConstants#FINDING_AGGREGATOR_ARN"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": 
"batchImportFindings, the default, imports the findings of the 
CamelAwsSecurityHubFindings header, or else of the body: a List of the 
AwsSecurityFinding of the AWS SDK, or one AwsSecurityFinding. JSON text, a Map, 
an array or a List of anything else fails. The other operations take their 
input from headers, such as CamelAwsSecurityHubFilters. Wit [...]
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the BatchImportFindingsResponse of 
batchImportFindings, with the counts in the CamelAwsSecurityHubSuccessCount and 
CamelAwsSecurityHubFailedCount headers: a finding that is not imported does not 
fail the exchange. getFindings gives a GetFindingsResponse, with the token of 
the next page in the CamelAwsSecurityHubNextToken header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws.securityhub.SecurityHubOperations", "enum": [ 
"batchImportFindings", "getFindings", "batchUpdateFindings", 
"getFindingHistory", "describeHub", "listEnabledProductsForImport", 
"getFindingAggregator" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "defaultValue": "b [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json
index a2d10fcebfdd..38431d346851 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json
@@ -90,6 +90,10 @@
     "CamelAwsAthenaStartQueryExecutionAttempts": { "index": 21, "kind": 
"header", "displayName": "", "group": "startQueryExecution", "label": 
"startQueryExecution", "required": false, "javaType": "int", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "Total number of attempts made to run the query. Will be greater 
than 1 if the query is retried.", "constantName": 
"org.apache.camel.component.aws2.athena.Athena2Constants#START_QUERY_EXECUTION 
[...]
     "CamelAwsAthenaStartQueryExecutionElapsedMillis": { "index": 22, "kind": 
"header", "displayName": "", "group": "startQueryExecution", "label": 
"startQueryExecution", "required": false, "javaType": "long", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "Total time in millis taken in startQueryExecution (mostly 
relevant when waiting for query completion within startQueryExecution).", 
"constantName": "org.apache.camel.component.aws2.athen [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "startQueryExecution", "carriers": [ "text", "bytes", 
"stream", "file", "null" ] } ], "description": "The SQL of startQueryExecution, 
the default, as text: bytes, a stream or a file are read as text, a Map or a 
POJO is sent as its toString(). With no body the SQL comes from the 
CamelAwsAthenaQueryString header or the queryString option. The other 
operations do not use the body: they take the id of  [...]
+    "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": 
"operation", "value": "startQueryExecution", "carriers": [ "null", "pojo" ] }, 
{ "option": "operation", "value": "getQueryResults", "carriers": [ "iterator", 
"pojo", "text" ] } ], "description": "startQueryExecution, the default, leaves 
no body, with the id of the query in the CamelAwsAthenaQueryExecutionId header; 
with waitTimeout, the GetQueryExecutionResponse of the AWS SDK of the last 
check, whatever the state of  [...]
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.athena.Athena2Configuration", 
"configurationField": "configuration", "description": "Logical name" },
     "database": { "index": 1, "kind": "parameter", "displayName": "Database", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.aws2.athena.Athena2Configuration", 
"configurationField": "configuration", "description": "The Athena database to 
use." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json
index 1078e8b06d89..a0bffdbfb326 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json
@@ -55,6 +55,10 @@
     "CamelAwsECSIsTruncated": { "index": 4, "kind": "header", "displayName": 
"", "group": "listClusters", "label": "listClusters", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the response has more results 
(is truncated).", "constantName": 
"org.apache.camel.component.aws2.ecs.ECS2Constants#IS_TRUNCATED" },
     "CamelAwsECSClusterArn": { "index": 5, "kind": "header", "displayName": 
"", "group": "createCluster describeCluster deleteCluster", "label": 
"createCluster describeCluster deleteCluster", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The ARN of the cluster.", "constantName": 
"org.apache.camel.component.aws2.ecs.ECS2Constants#CLUSTER_ARN" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the name of the 
cluster in CamelAwsECSClusterName. With pojoRequest=true the request of the AWS 
SDK for the operation, such as a ListClustersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListClustersResponse of 
listClusters, with the token of the next page in a header. describeCluster of a 
cluster that does not exist does not fail: the response lists it in its 
failures" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.ecs.ECS2Operations", 
"enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "configurationClass": 
"org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": 
"configuration" [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json
index b43403c1ba00..3cca2693328d 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json
@@ -58,6 +58,10 @@
     "CamelAwsEKSIsTruncated": { "index": 7, "kind": "header", "displayName": 
"", "group": "listClusters", "label": "listClusters", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the response has more results 
(is truncated).", "constantName": 
"org.apache.camel.component.aws2.eks.EKS2Constants#IS_TRUNCATED" },
     "CamelAwsEKSClusterArn": { "index": 8, "kind": "header", "displayName": 
"", "group": "createCluster describeCluster deleteCluster", "label": 
"createCluster describeCluster deleteCluster", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The ARN of the cluster.", "constantName": 
"org.apache.camel.component.aws2.eks.EKS2Constants#CLUSTER_ARN" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the name of the 
cluster in CamelAwsEKSClusterName. With pojoRequest=true the request of the AWS 
SDK for the operation, such as a ListClustersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListClustersResponse of 
listClusters, with the token of the next page in a header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.eks.EKS2Operations", 
"enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "configurationClass": 
"org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": 
"configuration" [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json
index a100694868ff..fe992fd16870 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json
@@ -64,6 +64,10 @@
     "CamelAwsMQBrokerArn": { "index": 13, "kind": "header", "displayName": "", 
"group": "createBroker", "label": "createBroker", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The Amazon Resource Name (ARN) of the 
broker.", "constantName": 
"org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_ARN" },
     "CamelAwsMQBrokerState": { "index": 14, "kind": "header", "displayName": 
"", "group": "describeBroker", "label": "describeBroker", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The state of the broker.", 
"constantName": "org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_STATE" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the id of the 
broker in CamelAwsMQBrokerID, and the users of createBroker as a List of the 
User of the AWS SDK. With pojoRequest=true the request of the AWS SDK for the 
operation, such as a ListBrokersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListBrokersResponse of listBrokers, 
with the token of the next page in a header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.mq.MQ2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.mq.MQ2Operations", "enum": 
[ "listBrokers", "createBroker", "deleteBroker", "rebootBroker", 
"updateBroker", "describeBroker" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.mq.MQ2Configuration", "configuratio [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json
index 42f2250df7fa..12ece07f27ef 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json
@@ -60,6 +60,10 @@
     "CamelAwsMSKIsTruncated": { "index": 9, "kind": "header", "displayName": 
"", "group": "listClusters", "label": "listClusters", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the response has more results 
(is truncated).", "constantName": 
"org.apache.camel.component.aws2.msk.MSK2Constants#IS_TRUNCATED" },
     "CamelAwsMSKClusterState": { "index": 10, "kind": "header", "displayName": 
"", "group": "createCluster describeCluster", "label": "createCluster 
describeCluster", "required": false, "javaType": "String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
state of the cluster.", "constantName": 
"org.apache.camel.component.aws2.msk.MSK2Constants#CLUSTER_STATE" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the ARN of the 
cluster in CamelAwsMSKClusterArn. With pojoRequest=true the request of the AWS 
SDK for the operation, such as a ListClustersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListClustersResponse of 
listClusters, with the token of the next page in a header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.msk.MSK2Operations", 
"enum": [ "listClusters", "createCluster", "deleteCluster", "describeCluster" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "configurationClass": 
"org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": 
"configuration" [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json
index 7db6bb872123..7175a5841d2f 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json
@@ -74,6 +74,10 @@
     "CamelAwsRedshiftDataSqlParameterList": { "index": 23, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "List<SqlParameterList>", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The parameters for the 
SQL statement.", "constantName": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_PARAMETER_LIST"
 },
     "CamelAwsRedshiftDataSqlStatementList": { "index": 24, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The List of SQL statements text to 
run.", "constantName": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_STATEMENT_LIST"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the SQL of 
executeStatement in CamelAwsRedshiftDataSqlStatement; SQL in the body is not 
run. With pojoRequest=true the request of the AWS SDK for the operation, such 
as an ExecuteStatementRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ExecuteStatementResponse of 
executeStatement, which does not wait for the statement, or the 
GetStatementResultResponse of getStatementResult with one page of records" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Configuration", 
"configurationField": "configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Operations", 
"enum": [ "listDatabases", "listSchemas", "listStatements", "listTables", 
"describeTable", "executeStatement", "batchExecuteStatement", 
"cancelStatement", "describeStatement", "getStatementResult" ], "deprecated": 
false, "deprecationNote": "", "autowired": fa [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json
index 58da8dc70451..bb56e4dada37 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json
@@ -77,6 +77,11 @@
     "CamelAwsS3VectorsIndexStatus": { "index": 15, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The status of the vector index", 
"constantName": 
"org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#INDEX_STATUS" 
},
     "CamelAwsS3VectorsVectorBucketArn": { "index": 16, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ARN of the vector bucket", 
"constantName": 
"org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#VECTOR_BUCKET_ARN"
 }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "pojo" ], "javaType": 
"software.amazon.awssdk.services.s3vectors.model.QueryOutputVector", 
"description": "One message per vector that the similarity search of 
consumerQueryVector finds and that was not sent before, as a QueryOutputVector 
of the AWS SDK with its key only, also in the CamelAwsS3VectorsVectorId header" 
},
+    "producerIn": { "carriers": [ "any" ], "description": "The vector of 
putVectors and queryVectors, unless the CamelAwsS3VectorsVectorData or 
CamelAwsS3VectorsQueryVector header has it: one vector as a List of numbers, a 
float[] or a double[]. Text such as a JSON array fails, so unmarshal it first. 
The keys of getVectors and deleteVectors, unless the CamelAwsS3VectorsVectorId 
header has them: a String, a String[] or a List of Strings. The other 
operations do not use the body" },
+    "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": 
"operation", "value": "queryVectors", "carriers": [ "list" ], "javaType": 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.QueryOutputVector>"
 }, { "option": "operation", "value": "getVectors", "carriers": [ "list" ], 
"javaType": 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.GetOutputVector>"
 }, { "option": "operation", "value": "listVectorBuckets", "carriers": [ "list" 
], "javaType":  [...]
+  },
   "properties": {
     "vectorBucketName": { "index": 0, "kind": "path", "displayName": "Vector 
Bucket Name", "group": "common", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Vector bucket name or ARN" },
     "dataType": { "index": 1, "kind": "parameter", "displayName": "Data Type", 
"group": "common", "label": "", "required": false, "type": "enum", "javaType": 
"java.lang.String", "enum": [ "float32", "float16" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "float32", 
"configurationClass": 
"org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConfiguration", 
"configurationField": "configuration", "description": "The data type of the 
vector. Options: float32, [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json
index 41c36bc55272..f85eca311ff1 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json
@@ -67,6 +67,10 @@
     "CamelAwsStepFunctionsExecutionHistoryReverseOrder": { "index": 16, 
"kind": "header", "displayName": "", "group": "producer", "label": "", 
"required": false, "javaType": "Boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Lists events in descending order of their timeStamp.", "constantName": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_REVERSE_ORDER"
 },
     "CamelAwsStepFunctionsExecutionMaxResults": { "index": 17, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The limit number of 
results while listing executions", "constantName": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTIONS_MAX_RESULTS"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the input of 
startExecution and startSyncExecution in the 
CamelAwsStepFunctionsExecutionInput header as JSON text: marshal a Map or a 
POJO first. With pojoRequest=true the request of the AWS SDK for the operation, 
such as a StartExecutionRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the StartExecutionResponse of 
startExecution with the ARN of the execution. startSyncExecution gives a 
StartSyncExecutionResponse whose output is the JSON that the execution returns, 
as text: a failed execution does not fail the exchange, so check its status" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", 
"configurationField": "configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", 
"enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", 
"describeStateMachine", "listStateMachines", "createActivity", 
"deleteActivity", "describeActivity", "getActivityTask", "listActivities", 
"startExecution", "startSyncExecution", "sto [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc
index db0c1ab3e52b..4e2973b34b4d 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc
@@ -406,8 +406,10 @@ YAML::
 ----
 ====
 
-The preceding example will yield an
-https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena
 QueryExecution] in the body.
+The preceding example will yield a
+https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryExecutionResponse.html[GetQueryExecutionResponse]
+in the body, whose `queryExecution()` is the
+https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena
 QueryExecution].
 
 The getQueryExecution operation also supports retrieving the query execution 
ID from a header
 (`CamelAwsAthenaQueryExecutionId`), and since startQueryExecution sets the 
same header, upon starting a query,
@@ -466,7 +468,7 @@ YAML::
 ----
 ====
 
-The preceding example will yield an Athena QueryExecution in the body for the 
query that was just started.
+The preceding example will yield a GetQueryExecutionResponse in the body for 
the query that was just started.
 
 - getQueryResults: this operation returns the results of a query that has 
succeeded.  The results are returned in the
 body in one of three formats.
@@ -556,7 +558,7 @@ from("direct:start")
 The preceding example will print the results of the query as CSV to the 
console.
 
 `SelectList` - returns a
-https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse]
+https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse]
 in the body containing at most 1,000 rows, plus the NextToken value as a 
header (`CamelAwsAthenaNextToken`),
 which can be used for manual pagination of results:
 
@@ -616,11 +618,11 @@ YAML::
 ====
 
 The preceding example will return a
-https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse]
+https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse]
 in the body plus the NextToken value as a header (`CamelAwsAthenaNextToken`), 
which can be used to manually page
 through the results 1,000 rows at a time.
 
-`S3Pointer` - return an S3 path (e.g. `s3://bucket/path/`) pointing to the 
results:
+`S3Pointer` - returns the S3 location of the results of the query as text:
 
 [tabs]
 ====
@@ -677,9 +679,8 @@ YAML::
 ----
 ====
 
-The preceding example will return an
-S3 path (e.g. `s3://bucket/path/`) in the body pointing to the results.  The 
path will also be set in a header
-(`CamelAwsAthenaOutputLocation`).
+The preceding example will return the S3 location of the results of the query 
as text in the body.
+The location will also be set in a header (`CamelAwsAthenaOutputLocation`).
 
 - listQueryExecutions: this operation returns a list of query execution IDs
 
@@ -722,8 +723,9 @@ YAML::
 ----
 ====
 
-The preceding example will return a list of query executions in the body, plus 
the NextToken value as a
-header (`CamelAwsAthenaNextToken`) than can be used for manual pagination of 
results.
+The preceding example will return a ListQueryExecutionsResponse in the body, 
whose `queryExecutionIds()` lists the
+ids of the query executions, plus the NextToken value as a header 
(`CamelAwsAthenaNextToken`) that can be used for
+manual pagination of results.
 
 - startQueryExecution: this operation starts the execution of a query.  It 
supports waiting for the query to
 complete before proceeding, and retrying the query based on a set of 
configurable failure conditions:
@@ -777,7 +779,8 @@ YAML::
 
 The preceding example will start the query `SELECT 1` and configure the
 results to be saved to `s3://bucket/path/`, but will not wait for the query
-to complete.
+to complete. The body is then empty, and the id of the query is in the
+`CamelAwsAthenaQueryExecutionId` header.
 
 [tabs]
 ====
@@ -830,6 +833,9 @@ YAML::
 The preceding example will start a query and wait up to 60 seconds for it to
 reach a status that indicates it is complete (one of SUCCEEDED, FAILED, 
CANCELLED,
 or UNKNOWN_TO_SDK_VERSION).  Upon failure, the query would not be retried.
+The body is then the GetQueryExecutionResponse of the last check: a query that 
fails, or
+still runs after the wait, does not fail the exchange, so check the state of 
the query in the
+`CamelAwsAthenaQueryExecutionState` header.
 
 [tabs]
 ====
diff --git 
a/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json
 
b/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json
index c9b79f9de9fd..7ed9e9726c47 100644
--- 
a/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json
+++ 
b/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json
@@ -56,6 +56,10 @@
     "CamelAwsConfigConformacePackS3TemplateURI": { "index": 5, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The location of the file 
containing the template body in S3", "constantName": 
"org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_S3_TEMPLATE_URI"
 },
     "CamelAwsConfigConformacePackTemplateBody": { "index": 6, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "A string containing the 
full conformance pack template body", "constantName": 
"org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_TEMPLATE_BODY"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the rule of 
putConfigRule in CamelAwsConfigRuleName, CamelAwsConfigRuleSource and 
CamelAwsConfigRuleSourceIdentifier, and the template of putConformancePack in 
CamelAwsConfigConformacePackTemplateBody. With pojoRequest=true the request of 
the AWS SDK for the operation, such as a Put [...]
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the 
DescribeComplianceByConfigRuleResponse of describeRuleCompliance, or the 
PutConformancePackResponse with the ARN of the pack. putConfigRule, 
removeConfigRule and removeConformancePack give an empty response" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws.config.AWSConfigConfiguration", 
"configurationField": "configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws.config.AWSConfigOperations", "enum": [ 
"putConfigRule", "removeConfigRule", "describeRuleCompliance", 
"putConformancePack", "removeConformancePack" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.aws.config.AWSConf [...]
diff --git 
a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.java
 
b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.java
index 4bbb097c7c42..8ff6a102b545 100644
--- 
a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.java
+++ 
b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.aws.config.client.AWSConfigClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,19 @@ import software.amazon.awssdk.services.config.ConfigClient;
 @UriEndpoint(firstVersion = "4.3.0", scheme = "aws-config", title = "AWS 
Config Service",
              syntax = "aws-config:label", producerOnly = true, category = { 
Category.CLOUD, Category.MANAGEMENT },
              headersClass = AWSConfigConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used: the operations take 
their input from headers, such as the rule of"
+                                                + " putConfigRule in 
CamelAwsConfigRuleName, CamelAwsConfigRuleSource and"
+                                                + " 
CamelAwsConfigRuleSourceIdentifier, and the template of putConformancePack"
+                                                + " in 
CamelAwsConfigConformacePackTemplateBody. With pojoRequest=true the"
+                                                + " request of the AWS SDK for 
the operation, such as a PutConfigRuleRequest:"
+                                                + " another body fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " 
DescribeComplianceByConfigRuleResponse of describeRuleCompliance, or the"
+                                                 + " 
PutConformancePackResponse with the ARN of the pack. putConfigRule,"
+                                                 + " removeConfigRule and 
removeConformancePack give an empty response"))
 public class AWSConfigEndpoint extends DefaultEndpoint implements 
EndpointServiceLocation {
 
     private ConfigClient configClient;
diff --git 
a/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json
 
b/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json
index ca3e6283d7c9..05ef7282d4e9 100644
--- 
a/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json
+++ 
b/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json
@@ -63,6 +63,10 @@
     "CamelAwsParameterStoreKmsKeyId": { "index": 12, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The KMS Key ID to use for SecureString 
encryption.", "constantName": 
"org.apache.camel.component.aws.parameterstore.ParameterStoreConstants#KMS_KEY_ID"
 },
     "CamelAwsParameterStoreTier": { "index": 13, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The tier for the parameter (Standard, 
Advanced, Intelligent-Tiering).", "constantName": 
"org.apache.camel.component.aws.parameterstore.ParameterStoreConstants#PARAMETER_TIER"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used, except by putParameter when the CamelAwsParameterStoreValue header is not 
set: the value of the parameter as text. Bytes, a stream or a file are read as 
text, a Map or a POJO is stored as its toString(), so marshal it first, and no 
body fails. The other operations take their input from headers, such as 
CamelAwsParameterStoreName. With  [...]
+    "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": 
"operation", "value": "getParameter", "carriers": [ "text" ], "javaType": 
"java.lang.String" } ], "description": "The value of the parameter as text for 
getParameter, with its version in the CamelAwsParameterStoreVersion header: a 
SecureString is decrypted only when the CamelAwsParameterStoreWithDecryption 
header is true. The response of the AWS SDK for the other operations, such as 
the GetParametersResponse of getPar [...]
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws.parameterstore.ParameterStoreConfiguration", 
"configurationField": "configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws.parameterstore.ParameterStoreOperations", 
"enum": [ "getParameter", "getParameters", "getParametersByPath", 
"putParameter", "deleteParameter", "deleteParameters", "describeParameters", 
"getParameterHistory" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "configur [...]
diff --git 
a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.java
 
b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.java
index 7f87915a4c85..63a63e4029e5 100644
--- 
a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.java
+++ 
b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import 
org.apache.camel.component.aws.parameterstore.client.ParameterStoreClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,24 @@ import software.amazon.awssdk.services.ssm.SsmClient;
 @UriEndpoint(firstVersion = "4.17.0", scheme = "aws-parameter-store", title = 
"AWS Parameter Store",
              syntax = "aws-parameter-store:label", producerOnly = true, 
category = { Category.CLOUD, Category.MANAGEMENT },
              headersClass = ParameterStoreConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used, except by 
putParameter when the CamelAwsParameterStoreValue header"
+                                                + " is not set: the value of 
the parameter as text. Bytes, a stream or a file"
+                                                + " are read as text, a Map or 
a POJO is stored as its toString(), so marshal"
+                                                + " it first, and no body 
fails. The other operations take their input from"
+                                                + " headers, such as 
CamelAwsParameterStoreName. With pojoRequest=true the"
+                                                + " request of the AWS SDK for 
the operation, such as a GetParameterRequest:"
+                                                + " another body fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   byOption = @BodyType.When(option = 
"operation", value = "getParameter",
+                                                             carriers = 
Carrier.TEXT,
+                                                             javaType = 
"java.lang.String"),
+                                   description = "The value of the parameter 
as text for getParameter, with its version in the"
+                                                 + " 
CamelAwsParameterStoreVersion header: a SecureString is decrypted only"
+                                                 + " when the 
CamelAwsParameterStoreWithDecryption header is true. The response"
+                                                 + " of the AWS SDK for the 
other operations, such as the GetParametersResponse"
+                                                 + " of getParameters, whose 
invalidParameters() lists the names not found"))
 public class ParameterStoreEndpoint extends ScheduledPollEndpoint implements 
EndpointServiceLocation {
 
     private SsmClient ssmClient;
diff --git 
a/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json
 
b/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json
index c550f5a64599..46894fe3a2ce 100644
--- 
a/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json
+++ 
b/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json
@@ -71,6 +71,10 @@
     "CamelAwsSecurityHubProductArn": { "index": 20, "kind": "header", 
"displayName": "", "group": "getFindingHistory", "label": "getFindingHistory", 
"required": false, "javaType": "String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
product ARN for the finding", "constantName": 
"org.apache.camel.component.aws.securityhub.SecurityHubConstants#PRODUCT_ARN" },
     "CamelAwsSecurityHubFindingAggregatorArn": { "index": 21, "kind": 
"header", "displayName": "", "group": "getFindingAggregator", "label": 
"getFindingAggregator", "required": false, "javaType": "String", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "The ARN of the finding aggregator to retrieve", "constantName": 
"org.apache.camel.component.aws.securityhub.SecurityHubConstants#FINDING_AGGREGATOR_ARN"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": 
"batchImportFindings, the default, imports the findings of the 
CamelAwsSecurityHubFindings header, or else of the body: a List of the 
AwsSecurityFinding of the AWS SDK, or one AwsSecurityFinding. JSON text, a Map, 
an array or a List of anything else fails. The other operations take their 
input from headers, such as CamelAwsSecurityHubFilters. Wit [...]
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the BatchImportFindingsResponse of 
batchImportFindings, with the counts in the CamelAwsSecurityHubSuccessCount and 
CamelAwsSecurityHubFailedCount headers: a finding that is not imported does not 
fail the exchange. getFindings gives a GetFindingsResponse, with the token of 
the next page in the CamelAwsSecurityHubNextToken header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws.securityhub.SecurityHubOperations", "enum": [ 
"batchImportFindings", "getFindings", "batchUpdateFindings", 
"getFindingHistory", "describeHub", "listEnabledProductsForImport", 
"getFindingAggregator" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "defaultValue": "b [...]
diff --git 
a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java
 
b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java
index 679a76f0378d..24e57b222aea 100644
--- 
a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java
+++ 
b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java
@@ -24,6 +24,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import 
org.apache.camel.component.aws.securityhub.client.SecurityHubClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
@@ -41,6 +44,22 @@ import 
software.amazon.awssdk.services.securityhub.SecurityHubClient;
                      Category.CLOUD,
                      Category.SECURITY },
              headersClass = SecurityHubConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "batchImportFindings, the 
default, imports the findings of the"
+                                                + " 
CamelAwsSecurityHubFindings header, or else of the body: a List of the"
+                                                + " AwsSecurityFinding of the 
AWS SDK, or one AwsSecurityFinding. JSON text, a"
+                                                + " Map, an array or a List of 
anything else fails. The other operations take"
+                                                + " their input from headers, 
such as CamelAwsSecurityHubFilters. With"
+                                                + " pojoRequest=true the 
request of the AWS SDK for the operation, such as a"
+                                                + " GetFindingsRequest: 
another body fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " 
BatchImportFindingsResponse of batchImportFindings, with the counts in the"
+                                                 + " 
CamelAwsSecurityHubSuccessCount and CamelAwsSecurityHubFailedCount"
+                                                 + " headers: a finding that 
is not imported does not fail the exchange."
+                                                 + " getFindings gives a 
GetFindingsResponse, with the token of the next page"
+                                                 + " in the 
CamelAwsSecurityHubNextToken header"))
 public class SecurityHubEndpoint extends DefaultEndpoint implements 
EndpointServiceLocation {
 
     private SecurityHubClient securityHubClient;
diff --git 
a/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json
 
b/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json
index a2d10fcebfdd..38431d346851 100644
--- 
a/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json
+++ 
b/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json
@@ -90,6 +90,10 @@
     "CamelAwsAthenaStartQueryExecutionAttempts": { "index": 21, "kind": 
"header", "displayName": "", "group": "startQueryExecution", "label": 
"startQueryExecution", "required": false, "javaType": "int", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "Total number of attempts made to run the query. Will be greater 
than 1 if the query is retried.", "constantName": 
"org.apache.camel.component.aws2.athena.Athena2Constants#START_QUERY_EXECUTION 
[...]
     "CamelAwsAthenaStartQueryExecutionElapsedMillis": { "index": 22, "kind": 
"header", "displayName": "", "group": "startQueryExecution", "label": 
"startQueryExecution", "required": false, "javaType": "long", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "Total time in millis taken in startQueryExecution (mostly 
relevant when waiting for query completion within startQueryExecution).", 
"constantName": "org.apache.camel.component.aws2.athen [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "startQueryExecution", "carriers": [ "text", "bytes", 
"stream", "file", "null" ] } ], "description": "The SQL of startQueryExecution, 
the default, as text: bytes, a stream or a file are read as text, a Map or a 
POJO is sent as its toString(). With no body the SQL comes from the 
CamelAwsAthenaQueryString header or the queryString option. The other 
operations do not use the body: they take the id of  [...]
+    "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": 
"operation", "value": "startQueryExecution", "carriers": [ "null", "pojo" ] }, 
{ "option": "operation", "value": "getQueryResults", "carriers": [ "iterator", 
"pojo", "text" ] } ], "description": "startQueryExecution, the default, leaves 
no body, with the id of the query in the CamelAwsAthenaQueryExecutionId header; 
with waitTimeout, the GetQueryExecutionResponse of the AWS SDK of the last 
check, whatever the state of  [...]
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.athena.Athena2Configuration", 
"configurationField": "configuration", "description": "Logical name" },
     "database": { "index": 1, "kind": "parameter", "displayName": "Database", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.aws2.athena.Athena2Configuration", 
"configurationField": "configuration", "description": "The Athena database to 
use." },
diff --git 
a/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc
 
b/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc
index db0c1ab3e52b..4e2973b34b4d 100644
--- 
a/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc
+++ 
b/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc
@@ -406,8 +406,10 @@ YAML::
 ----
 ====
 
-The preceding example will yield an
-https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena
 QueryExecution] in the body.
+The preceding example will yield a
+https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryExecutionResponse.html[GetQueryExecutionResponse]
+in the body, whose `queryExecution()` is the
+https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena
 QueryExecution].
 
 The getQueryExecution operation also supports retrieving the query execution 
ID from a header
 (`CamelAwsAthenaQueryExecutionId`), and since startQueryExecution sets the 
same header, upon starting a query,
@@ -466,7 +468,7 @@ YAML::
 ----
 ====
 
-The preceding example will yield an Athena QueryExecution in the body for the 
query that was just started.
+The preceding example will yield a GetQueryExecutionResponse in the body for 
the query that was just started.
 
 - getQueryResults: this operation returns the results of a query that has 
succeeded.  The results are returned in the
 body in one of three formats.
@@ -556,7 +558,7 @@ from("direct:start")
 The preceding example will print the results of the query as CSV to the 
console.
 
 `SelectList` - returns a
-https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse]
+https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse]
 in the body containing at most 1,000 rows, plus the NextToken value as a 
header (`CamelAwsAthenaNextToken`),
 which can be used for manual pagination of results:
 
@@ -616,11 +618,11 @@ YAML::
 ====
 
 The preceding example will return a
-https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse]
+https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse]
 in the body plus the NextToken value as a header (`CamelAwsAthenaNextToken`), 
which can be used to manually page
 through the results 1,000 rows at a time.
 
-`S3Pointer` - return an S3 path (e.g. `s3://bucket/path/`) pointing to the 
results:
+`S3Pointer` - returns the S3 location of the results of the query as text:
 
 [tabs]
 ====
@@ -677,9 +679,8 @@ YAML::
 ----
 ====
 
-The preceding example will return an
-S3 path (e.g. `s3://bucket/path/`) in the body pointing to the results.  The 
path will also be set in a header
-(`CamelAwsAthenaOutputLocation`).
+The preceding example will return the S3 location of the results of the query 
as text in the body.
+The location will also be set in a header (`CamelAwsAthenaOutputLocation`).
 
 - listQueryExecutions: this operation returns a list of query execution IDs
 
@@ -722,8 +723,9 @@ YAML::
 ----
 ====
 
-The preceding example will return a list of query executions in the body, plus 
the NextToken value as a
-header (`CamelAwsAthenaNextToken`) than can be used for manual pagination of 
results.
+The preceding example will return a ListQueryExecutionsResponse in the body, 
whose `queryExecutionIds()` lists the
+ids of the query executions, plus the NextToken value as a header 
(`CamelAwsAthenaNextToken`) that can be used for
+manual pagination of results.
 
 - startQueryExecution: this operation starts the execution of a query.  It 
supports waiting for the query to
 complete before proceeding, and retrying the query based on a set of 
configurable failure conditions:
@@ -777,7 +779,8 @@ YAML::
 
 The preceding example will start the query `SELECT 1` and configure the
 results to be saved to `s3://bucket/path/`, but will not wait for the query
-to complete.
+to complete. The body is then empty, and the id of the query is in the
+`CamelAwsAthenaQueryExecutionId` header.
 
 [tabs]
 ====
@@ -830,6 +833,9 @@ YAML::
 The preceding example will start a query and wait up to 60 seconds for it to
 reach a status that indicates it is complete (one of SUCCEEDED, FAILED, 
CANCELLED,
 or UNKNOWN_TO_SDK_VERSION).  Upon failure, the query would not be retried.
+The body is then the GetQueryExecutionResponse of the last check: a query that 
fails, or
+still runs after the wait, does not fail the exchange, so check the state of 
the query in the
+`CamelAwsAthenaQueryExecutionState` header.
 
 [tabs]
 ====
diff --git 
a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java
 
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java
index 86e00791af64..e7fff36bac8a 100644
--- 
a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java
@@ -24,6 +24,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.aws2.athena.client.Athena2ClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -36,6 +39,30 @@ import software.amazon.awssdk.services.athena.AthenaClient;
  */
 @UriEndpoint(firstVersion = "3.4.0", scheme = "aws2-athena", title = "AWS 
Athena", syntax = "aws2-athena:label",
              producerOnly = true, category = { Category.CLOUD, 
Category.DATABASE }, headersClass = Athena2Constants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"operation", value = "startQueryExecution", carriers = {
+                                          Carrier.TEXT, Carrier.BYTES, 
Carrier.STREAM, Carrier.FILE, Carrier.NULL }),
+                                  description = "The SQL of 
startQueryExecution, the default, as text: bytes, a stream or a"
+                                                + " file are read as text, a 
Map or a POJO is sent as its toString(). With no"
+                                                + " body the SQL comes from 
the CamelAwsAthenaQueryString header or the"
+                                                + " queryString option. The 
other operations do not use the body: they take the"
+                                                + " id of the query from the 
CamelAwsAthenaQueryExecutionId header, which"
+                                                + " startQueryExecution sets"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "startQueryExecution",
+                                                          carriers = { 
Carrier.NULL, Carrier.POJO }),
+                                           @BodyType.When(option = 
"operation", value = "getQueryResults",
+                                                          carriers = { 
Carrier.ITERATOR, Carrier.POJO, Carrier.TEXT }) },
+                                   description = "startQueryExecution, the 
default, leaves no body, with the id of the query in"
+                                                 + " the 
CamelAwsAthenaQueryExecutionId header; with waitTimeout, the"
+                                                 + " GetQueryExecutionResponse 
of the AWS SDK of the last check, whatever the"
+                                                 + " state of the query. 
getQueryResults gives by outputType: for StreamList,"
+                                                 + " the default, a 
GetQueryResultsIterable of the pages of rows, which calls"
+                                                 + " Athena when it is read, 
such as by a split; for SelectList one page as a"
+                                                 + " GetQueryResultsResponse; 
for S3Pointer the S3 location of the results as"
+                                                 + " text. getQueryExecution 
and listQueryExecutions give the response of the"
+                                                 + " AWS SDK"))
 public class Athena2Endpoint extends DefaultEndpoint implements 
EndpointServiceLocation {
 
     private AthenaClient athenaClient;
diff --git 
a/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json
 
b/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json
index 1078e8b06d89..a0bffdbfb326 100644
--- 
a/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json
+++ 
b/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json
@@ -55,6 +55,10 @@
     "CamelAwsECSIsTruncated": { "index": 4, "kind": "header", "displayName": 
"", "group": "listClusters", "label": "listClusters", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the response has more results 
(is truncated).", "constantName": 
"org.apache.camel.component.aws2.ecs.ECS2Constants#IS_TRUNCATED" },
     "CamelAwsECSClusterArn": { "index": 5, "kind": "header", "displayName": 
"", "group": "createCluster describeCluster deleteCluster", "label": 
"createCluster describeCluster deleteCluster", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The ARN of the cluster.", "constantName": 
"org.apache.camel.component.aws2.ecs.ECS2Constants#CLUSTER_ARN" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the name of the 
cluster in CamelAwsECSClusterName. With pojoRequest=true the request of the AWS 
SDK for the operation, such as a ListClustersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListClustersResponse of 
listClusters, with the token of the next page in a header. describeCluster of a 
cluster that does not exist does not fail: the response lists it in its 
failures" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.ecs.ECS2Operations", 
"enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "configurationClass": 
"org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": 
"configuration" [...]
diff --git 
a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.java
 
b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.java
index 285f629d1a41..23f15686e661 100644
--- 
a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.aws2.ecs.client.ECS2ClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,17 @@ import software.amazon.awssdk.services.ecs.EcsClient;
 @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-ecs", title = "AWS Elastic 
Container Service (ECS)",
              syntax = "aws2-ecs:label", producerOnly = true, category = { 
Category.CLOUD, Category.MANAGEMENT },
              headersClass = ECS2Constants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used: the operations take 
their input from headers, such as the name of"
+                                                + " the cluster in 
CamelAwsECSClusterName. With pojoRequest=true the request of"
+                                                + " the AWS SDK for the 
operation, such as a ListClustersRequest: another body"
+                                                + " fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " ListClustersResponse of 
listClusters, with the token of the next page in a"
+                                                 + " header. describeCluster 
of a cluster that does not exist does not fail:"
+                                                 + " the response lists it in 
its failures"))
 public class ECS2Endpoint extends ScheduledPollEndpoint implements 
EndpointServiceLocation {
 
     private EcsClient ecsClient;
diff --git 
a/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json
 
b/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json
index b43403c1ba00..3cca2693328d 100644
--- 
a/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json
+++ 
b/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json
@@ -58,6 +58,10 @@
     "CamelAwsEKSIsTruncated": { "index": 7, "kind": "header", "displayName": 
"", "group": "listClusters", "label": "listClusters", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the response has more results 
(is truncated).", "constantName": 
"org.apache.camel.component.aws2.eks.EKS2Constants#IS_TRUNCATED" },
     "CamelAwsEKSClusterArn": { "index": 8, "kind": "header", "displayName": 
"", "group": "createCluster describeCluster deleteCluster", "label": 
"createCluster describeCluster deleteCluster", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The ARN of the cluster.", "constantName": 
"org.apache.camel.component.aws2.eks.EKS2Constants#CLUSTER_ARN" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the name of the 
cluster in CamelAwsEKSClusterName. With pojoRequest=true the request of the AWS 
SDK for the operation, such as a ListClustersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListClustersResponse of 
listClusters, with the token of the next page in a header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.eks.EKS2Operations", 
"enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "configurationClass": 
"org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": 
"configuration" [...]
diff --git 
a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.java
 
b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.java
index 184c7290f94f..8dec2adb6a20 100644
--- 
a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.aws2.eks.client.EKS2ClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,16 @@ import software.amazon.awssdk.services.eks.EksClient;
 @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-eks", title = "AWS Elastic 
Kubernetes Service (EKS)",
              syntax = "aws2-eks:label", producerOnly = true, category = { 
Category.CLOUD, Category.MANAGEMENT },
              headersClass = EKS2Constants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used: the operations take 
their input from headers, such as the name of"
+                                                + " the cluster in 
CamelAwsEKSClusterName. With pojoRequest=true the request of"
+                                                + " the AWS SDK for the 
operation, such as a ListClustersRequest: another body"
+                                                + " fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " ListClustersResponse of 
listClusters, with the token of the next page in a"
+                                                 + " header"))
 public class EKS2Endpoint extends ScheduledPollEndpoint implements 
EndpointServiceLocation {
 
     private EksClient eksClient;
diff --git 
a/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json
 
b/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json
index a100694868ff..fe992fd16870 100644
--- 
a/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json
+++ 
b/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json
@@ -64,6 +64,10 @@
     "CamelAwsMQBrokerArn": { "index": 13, "kind": "header", "displayName": "", 
"group": "createBroker", "label": "createBroker", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The Amazon Resource Name (ARN) of the 
broker.", "constantName": 
"org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_ARN" },
     "CamelAwsMQBrokerState": { "index": 14, "kind": "header", "displayName": 
"", "group": "describeBroker", "label": "describeBroker", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The state of the broker.", 
"constantName": "org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_STATE" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the id of the 
broker in CamelAwsMQBrokerID, and the users of createBroker as a List of the 
User of the AWS SDK. With pojoRequest=true the request of the AWS SDK for the 
operation, such as a ListBrokersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListBrokersResponse of listBrokers, 
with the token of the next page in a header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.mq.MQ2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.mq.MQ2Operations", "enum": 
[ "listBrokers", "createBroker", "deleteBroker", "rebootBroker", 
"updateBroker", "describeBroker" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.mq.MQ2Configuration", "configuratio [...]
diff --git 
a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.java
 
b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.java
index 76267f10158d..26961e13d129 100644
--- 
a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.aws2.mq.client.MQ2ClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -34,6 +37,16 @@ import software.amazon.awssdk.services.mq.MqClient;
  */
 @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-mq", title = "AWS MQ", 
syntax = "aws2-mq:label", producerOnly = true,
              category = { Category.CLOUD, Category.MESSAGING }, headersClass = 
MQ2Constants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used: the operations take 
their input from headers, such as the id of the"
+                                                + " broker in 
CamelAwsMQBrokerID, and the users of createBroker as a List of"
+                                                + " the User of the AWS SDK. 
With pojoRequest=true the request of the AWS SDK"
+                                                + " for the operation, such as 
a ListBrokersRequest: another body fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " ListBrokersResponse of 
listBrokers, with the token of the next page in a"
+                                                 + " header"))
 public class MQ2Endpoint extends ScheduledPollEndpoint implements 
EndpointServiceLocation {
 
     private MqClient mqClient;
diff --git 
a/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json
 
b/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json
index 42f2250df7fa..12ece07f27ef 100644
--- 
a/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json
+++ 
b/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json
@@ -60,6 +60,10 @@
     "CamelAwsMSKIsTruncated": { "index": 9, "kind": "header", "displayName": 
"", "group": "listClusters", "label": "listClusters", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the response has more results 
(is truncated).", "constantName": 
"org.apache.camel.component.aws2.msk.MSK2Constants#IS_TRUNCATED" },
     "CamelAwsMSKClusterState": { "index": 10, "kind": "header", "displayName": 
"", "group": "createCluster describeCluster", "label": "createCluster 
describeCluster", "required": false, "javaType": "String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
state of the cluster.", "constantName": 
"org.apache.camel.component.aws2.msk.MSK2Constants#CLUSTER_STATE" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the ARN of the 
cluster in CamelAwsMSKClusterArn. With pojoRequest=true the request of the AWS 
SDK for the operation, such as a ListClustersRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ListClustersResponse of 
listClusters, with the token of the next page in a header" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.msk.MSK2Operations", 
"enum": [ "listClusters", "createCluster", "deleteCluster", "describeCluster" 
], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "configurationClass": 
"org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": 
"configuration" [...]
diff --git 
a/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.java
 
b/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.java
index 2eaff93e3b84..686a15e16aee 100644
--- 
a/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.aws2.msk.client.MSK2ClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,16 @@ import software.amazon.awssdk.services.kafka.KafkaClient;
 @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-msk", title = "AWS Managed 
Streaming for Apache Kafka (MSK)",
              syntax = "aws2-msk:label", producerOnly = true, category = { 
Category.CLOUD, Category.MANAGEMENT },
              headersClass = MSK2Constants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used: the operations take 
their input from headers, such as the ARN of the"
+                                                + " cluster in 
CamelAwsMSKClusterArn. With pojoRequest=true the request of the"
+                                                + " AWS SDK for the operation, 
such as a ListClustersRequest: another body"
+                                                + " fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " ListClustersResponse of 
listClusters, with the token of the next page in a"
+                                                 + " header"))
 public class MSK2Endpoint extends ScheduledPollEndpoint implements 
EndpointServiceLocation {
 
     private KafkaClient mskClient;
diff --git 
a/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json
 
b/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json
index 7db6bb872123..7175a5841d2f 100644
--- 
a/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json
+++ 
b/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json
@@ -74,6 +74,10 @@
     "CamelAwsRedshiftDataSqlParameterList": { "index": 23, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "List<SqlParameterList>", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The parameters for the 
SQL statement.", "constantName": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_PARAMETER_LIST"
 },
     "CamelAwsRedshiftDataSqlStatementList": { "index": 24, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The List of SQL statements text to 
run.", "constantName": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_STATEMENT_LIST"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the SQL of 
executeStatement in CamelAwsRedshiftDataSqlStatement; SQL in the body is not 
run. With pojoRequest=true the request of the AWS SDK for the operation, such 
as an ExecuteStatementRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the ExecuteStatementResponse of 
executeStatement, which does not wait for the statement, or the 
GetStatementResultResponse of getStatementResult with one page of records" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Configuration", 
"configurationField": "configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws2.redshift.data.RedshiftData2Operations", 
"enum": [ "listDatabases", "listSchemas", "listStatements", "listTables", 
"describeTable", "executeStatement", "batchExecuteStatement", 
"cancelStatement", "describeStatement", "getStatementResult" ], "deprecated": 
false, "deprecationNote": "", "autowired": fa [...]
diff --git 
a/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.java
 
b/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.java
index 3ba18b0fc3aa..d1079c4bd61f 100644
--- 
a/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import 
org.apache.camel.component.aws2.redshift.data.client.RedshiftData2ClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -38,6 +41,17 @@ import 
software.amazon.awssdk.services.redshiftdata.RedshiftDataClient;
                      Category.CLOUD, Category.SERVERLESS,
                      Category.DATABASE, Category.BIGDATA },
              headersClass = RedshiftData2Constants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used: the operations take 
their input from headers, such as the SQL of"
+                                                + " executeStatement in 
CamelAwsRedshiftDataSqlStatement; SQL in the body is"
+                                                + " not run. With 
pojoRequest=true the request of the AWS SDK for the"
+                                                + " operation, such as an 
ExecuteStatementRequest: another body fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " ExecuteStatementResponse 
of executeStatement, which does not wait for the"
+                                                 + " statement, or the 
GetStatementResultResponse of getStatementResult with"
+                                                 + " one page of records"))
 public class RedshiftData2Endpoint extends DefaultEndpoint implements 
EndpointServiceLocation {
 
     private RedshiftDataClient awsRedshiftDataClient;
diff --git 
a/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json
 
b/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json
index 58da8dc70451..bb56e4dada37 100644
--- 
a/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json
+++ 
b/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json
@@ -77,6 +77,11 @@
     "CamelAwsS3VectorsIndexStatus": { "index": 15, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The status of the vector index", 
"constantName": 
"org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#INDEX_STATUS" 
},
     "CamelAwsS3VectorsVectorBucketArn": { "index": 16, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ARN of the vector bucket", 
"constantName": 
"org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#VECTOR_BUCKET_ARN"
 }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "pojo" ], "javaType": 
"software.amazon.awssdk.services.s3vectors.model.QueryOutputVector", 
"description": "One message per vector that the similarity search of 
consumerQueryVector finds and that was not sent before, as a QueryOutputVector 
of the AWS SDK with its key only, also in the CamelAwsS3VectorsVectorId header" 
},
+    "producerIn": { "carriers": [ "any" ], "description": "The vector of 
putVectors and queryVectors, unless the CamelAwsS3VectorsVectorData or 
CamelAwsS3VectorsQueryVector header has it: one vector as a List of numbers, a 
float[] or a double[]. Text such as a JSON array fails, so unmarshal it first. 
The keys of getVectors and deleteVectors, unless the CamelAwsS3VectorsVectorId 
header has them: a String, a String[] or a List of Strings. The other 
operations do not use the body" },
+    "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": 
"operation", "value": "queryVectors", "carriers": [ "list" ], "javaType": 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.QueryOutputVector>"
 }, { "option": "operation", "value": "getVectors", "carriers": [ "list" ], 
"javaType": 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.GetOutputVector>"
 }, { "option": "operation", "value": "listVectorBuckets", "carriers": [ "list" 
], "javaType":  [...]
+  },
   "properties": {
     "vectorBucketName": { "index": 0, "kind": "path", "displayName": "Vector 
Bucket Name", "group": "common", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Vector bucket name or ARN" },
     "dataType": { "index": 1, "kind": "parameter", "displayName": "Data Type", 
"group": "common", "label": "", "required": false, "type": "enum", "javaType": 
"java.lang.String", "enum": [ "float32", "float16" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "float32", 
"configurationClass": 
"org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConfiguration", 
"configurationField": "configuration", "description": "The data type of the 
vector. Options: float32, [...]
diff --git 
a/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java
 
b/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java
index 23dea141b1fd..9075c038b513 100644
--- 
a/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java
+++ 
b/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java
@@ -24,6 +24,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import 
org.apache.camel.component.aws2.s3vectors.client.AWS2S3VectorsClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
@@ -41,6 +44,37 @@ import 
software.amazon.awssdk.services.s3vectors.S3VectorsClient;
 @UriEndpoint(firstVersion = "4.17.0", scheme = "aws2-s3-vectors", title = "AWS 
S3 Vectors",
              syntax = "aws2-s3-vectors://vectorBucketName", category = { 
Category.CLOUD, Category.AI },
              headersClass = AWS2S3VectorsConstants.class)
+@BodyTypes(consumerOut = @BodyType(value = Carrier.POJO,
+                                   javaType = 
"software.amazon.awssdk.services.s3vectors.model.QueryOutputVector",
+                                   description = "One message per vector that 
the similarity search of consumerQueryVector"
+                                                 + " finds and that was not 
sent before, as a QueryOutputVector of the AWS SDK"
+                                                 + " with its key only, also 
in the CamelAwsS3VectorsVectorId header"),
+           producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "The vector of putVectors and 
queryVectors, unless the"
+                                                + " 
CamelAwsS3VectorsVectorData or CamelAwsS3VectorsQueryVector header has it:"
+                                                + " one vector as a List of 
numbers, a float[] or a double[]. Text such as a"
+                                                + " JSON array fails, so 
unmarshal it first. The keys of getVectors and"
+                                                + " deleteVectors, unless the 
CamelAwsS3VectorsVectorId header has them: a"
+                                                + " String, a String[] or a 
List of Strings. The other operations do not use"
+                                                + " the body"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "queryVectors", carriers = Carrier.LIST,
+                                                          javaType = 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.QueryOutputVector>"),
+                                           @BodyType.When(option = 
"operation", value = "getVectors", carriers = Carrier.LIST,
+                                                          javaType = 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.GetOutputVector>"),
+                                           @BodyType.When(option = 
"operation", value = "listVectorBuckets",
+                                                          carriers = 
Carrier.LIST,
+                                                          javaType = 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.VectorBucketSummary>"),
+                                           @BodyType.When(option = 
"operation", value = "listVectorIndexes",
+                                                          carriers = 
Carrier.LIST,
+                                                          javaType = 
"java.util.List<software.amazon.awssdk.services.s3vectors.model.IndexSummary>") 
},
+                                   description = "The response of the AWS SDK 
for the operation, such as the PutVectorsResponse"
+                                                 + " of putVectors, with the 
key of the vector in the CamelAwsS3VectorsVectorId"
+                                                 + " header. A List for 
queryVectors, getVectors, listVectorBuckets and"
+                                                 + " listVectorIndexes, the 
last two the first page only. The vectors of"
+                                                 + " queryVectors and 
getVectors hold their keys only: the distance, the data"
+                                                 + " and the metadata are not 
asked for"))
 public class AWS2S3VectorsEndpoint extends ScheduledPollEndpoint implements 
EndpointServiceLocation {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(AWS2S3VectorsEndpoint.class);
diff --git 
a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json
 
b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json
index 41c36bc55272..f85eca311ff1 100644
--- 
a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json
+++ 
b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json
@@ -67,6 +67,10 @@
     "CamelAwsStepFunctionsExecutionHistoryReverseOrder": { "index": 16, 
"kind": "header", "displayName": "", "group": "producer", "label": "", 
"required": false, "javaType": "Boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Lists events in descending order of their timeStamp.", "constantName": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_REVERSE_ORDER"
 },
     "CamelAwsStepFunctionsExecutionMaxResults": { "index": 17, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The limit number of 
results while listing executions", "constantName": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTIONS_MAX_RESULTS"
 }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not 
used: the operations take their input from headers, such as the input of 
startExecution and startSyncExecution in the 
CamelAwsStepFunctionsExecutionInput header as JSON text: marshal a Map or a 
POJO first. With pojoRequest=true the request of the AWS SDK for the operation, 
such as a StartExecutionRequest: another body fails" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the AWS SDK for the operation, such as the StartExecutionResponse of 
startExecution with the ARN of the execution. startSyncExecution gives a 
StartSyncExecutionResponse whose output is the JSON that the execution returns, 
as text: a failed execution does not fail the exchange, so check its status" }
+  },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", 
"configurationField": "configuration", "description": "Logical name" },
     "operation": { "index": 1, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"enum", "javaType": 
"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", 
"enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", 
"describeStateMachine", "listStateMachines", "createActivity", 
"deleteActivity", "describeActivity", "getActivityTask", "listActivities", 
"startExecution", "startSyncExecution", "sto [...]
diff --git 
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java
 
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java
index 03738f5b78e3..9e0d09d30890 100644
--- 
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java
@@ -18,6 +18,9 @@ package org.apache.camel.component.aws2.stepfunctions;
 
 import org.apache.camel.*;
 import 
org.apache.camel.component.aws2.stepfunctions.client.StepFunctions2ClientFactory;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -32,6 +35,19 @@ import software.amazon.awssdk.services.sfn.SfnClient;
              syntax = "aws2-step-functions:label",
              producerOnly = true, category = { Category.CLOUD, 
Category.SERVERLESS },
              headersClass = StepFunctions2Constants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = @BodyType.When(option = 
"pojoRequest", value = "true", carriers = Carrier.POJO),
+                                  description = "Not used: the operations take 
their input from headers, such as the input of"
+                                                + " startExecution and 
startSyncExecution in the"
+                                                + " 
CamelAwsStepFunctionsExecutionInput header as JSON text: marshal a Map or a"
+                                                + " POJO first. With 
pojoRequest=true the request of the AWS SDK for the"
+                                                + " operation, such as a 
StartExecutionRequest: another body fails"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the AWS SDK 
for the operation, such as the"
+                                                 + " StartExecutionResponse of 
startExecution with the ARN of the execution."
+                                                 + " startSyncExecution gives 
a StartSyncExecutionResponse whose output is the"
+                                                 + " JSON that the execution 
returns, as text: a failed execution does not fail"
+                                                 + " the exchange, so check 
its status"))
 public class StepFunctions2Endpoint extends DefaultEndpoint implements 
EndpointServiceLocation {
 
     private SfnClient awsSfnClient;
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java
index 4fed1d1142d2..4a41b41e1d63 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java
@@ -2018,6 +2018,68 @@ public class TextBodyFlowTest {
                 .anySatisfy(m -> assertThat(m).contains("route trail: simple 
reads a field of the body (${body[eventName]})"));
     }
 
+    @Test
+    public void testTheBodyOfAwsDataAndAdminServices() {
+        // the SQL of startQueryExecution of aws2-athena is text, so a Map is 
sent as its toString(), and queryVectors
+        // of aws2-s3-vectors gives a List of the vectors found, not text. 
ecs, eks, mq, msk, config, security-hub,
+        // step-functions and redshift-data take their input from headers, the 
vector of putVectors can be in a header,
+        // and athena without an operation is not known, as the component may 
set it
+        String yaml = """
+                - route:
+                    id: query
+                    from:
+                      uri: timer:tick
+                      steps:
+                        - setBody:
+                            constant: '{"sql": "SELECT 1"}'
+                        - unmarshal:
+                            json: {}
+                        - to: 
aws2-athena:a?operation=startQueryExecution&outputLocation=s3://bucket/path/
+                - route:
+                    id: similar
+                    from:
+                      uri: timer:tick
+                      steps:
+                        - setBody:
+                            constant: '[0.1, 0.2, 0.3]'
+                        - unmarshal:
+                            json: {}
+                        - to: 
aws2-s3-vectors:v?operation=queryVectors&vectorIndexName=i
+                        - to: 
aws2-translate:t?sourceLanguage=en&targetLanguage=de
+                - route:
+                    id: admin
+                    from:
+                      uri: timer:tick
+                      steps:
+                        - setBody:
+                            constant: '{"id": 1}'
+                        - unmarshal:
+                            json: {}
+                        - to: aws2-ecs:e?operation=listClusters
+                        - to: aws2-eks:k?operation=listClusters
+                        - to: aws2-mq:m?operation=listBrokers
+                        - to: aws2-msk:k?operation=listClusters
+                        - to: aws-config:c?operation=describeRuleCompliance
+                        - to: aws-security-hub:s?operation=getFindings
+                        - to: aws2-step-functions:f?operation=startExecution
+                        - to: aws2-redshift-data:r?operation=executeStatement
+                - route:
+                    id: vectors
+                    from:
+                      uri: timer:tick
+                      steps:
+                        - setBody:
+                            constant: '{"id": 1}'
+                        - unmarshal:
+                            json: {}
+                        - to: 
aws2-s3-vectors:v?operation=putVectors&vectorIndexName=i
+                        - to: aws2-athena:a?outputLocation=s3://bucket/path/
+                """;
+        assertThat(lines(yaml)).hasSize(2)
+                .anySatisfy(m -> assertThat(m).contains("route query: to: 
aws2-athena needs the body as text"))
+                .anySatisfy(m -> assertThat(m).contains("route similar: to: 
aws2-translate needs the body as text"));
+    }
+
     @Test
     public void testAnOptionValueInAnotherStyleOfTheEnum() {
         // the catalog and the enum type converter take convert-to-json and 
convertToJson as CONVERT_TO_JSON, so after

Reply via email to