Andrea Cosentino created CAMEL-24261:
----------------------------------------

             Summary: camel-aws2: producers silently no-op when 
pojoRequest=true and the body has the wrong type (complete CAMEL-23462 across 
all producers)
                 Key: CAMEL-24261
                 URL: https://issues.apache.org/jira/browse/CAMEL-24261
             Project: Camel
          Issue Type: Bug
          Components: camel-aws
            Reporter: Andrea Cosentino


h3. Summary

CAMEL-23462 fixed {{BedrockProducer}} so that {{invoke*Model}} throws 
{{IllegalArgumentException}} instead of silently producing a {{null}} body when 
{{pojoRequest=true}} and the exchange body is not the expected request type. 
The *same antipattern* is still present in ~19 other AWS v2 producers, covering 
*191* operation branches.

h3. The antipattern

Every pojo-mode branch has the shape:

{code:java}
if (getConfiguration().isPojoRequest()) {
    Object payload = exchange.getIn().getMandatoryBody();
    if (payload instanceof ListBrokersRequest listBrokersRequest) {
        ... call AWS, set response ...
    }
    // <-- no else: a wrong-typed body falls straight through
} else {
    ... build request from headers ...
}
{code}

If {{pojoRequest=true}} and the body is not the expected request type, the 
{{instanceof}} is false, the branch is skipped, and the method returns without 
calling AWS or setting any response. The caller silently gets the *original 
body back and no error*.

h4. Reproduced

Sending a {{String}} body to 
{{aws2-mq:...?operation=listBrokers&pojoRequest=true}}:
* {{exchange.getException()}} = {{null}}
* out body = the original {{String}}, unchanged
* AWS was never called

This is the exact behaviour CAMEL-23462 classified as a bug for Bedrock.

h3. Established fix (from CAMEL-23462)

Add the missing {{else}} that throws, naming the required type:

{code:java}
} else {
    throw new IllegalArgumentException(
            "listBrokers operation requires ListBrokersRequest in POJO mode");
}
{code}

h3. Inventory (silent-fallthrough sites per producer)

{noformat}
30  Transcribe2Producer
27  Rekognition2Producer
22  AWS2S3Producer
16  StepFunctions2Producer
16  Timestream2WriteProducer
10  RedshiftData2Producer
10  Timestream2QueryProducer
 9  AWS2EC2Producer
 9  Textract2Producer
 9  Polly2Producer
 9  Comprehend2Producer
 6  MQ2Producer
 5  AWSConfigProducer
 4  MSK2Producer
 3  BedrockAgentProducer
 3  STS2Producer
 1  BedrockAgentRuntimeProducer (2 of 3 already fixed)
 1  EventbridgeProducer
 1  Translate2Producer
---
191 sites across 19 producers
{noformat}

({{BedrockProducer}} is already fully fixed by CAMEL-23462 and is excluded.)

h3. Notes for implementation

* This is a *user-visible behaviour change* (silent no-op -> 
{{IllegalArgumentException}}), so it needs an upgrade-guide entry. CAMEL-23462 
shipped the same change in a minor (4.21.0).
* Recommend doing it *per component* (one PR each, mirroring CAMEL-23462) to 
keep diffs reviewable, rather than one 191-site sweep. This umbrella tracks the 
whole set.
* Each message should name the operation and the required request type 
consistently with the Bedrock wording (\"<operation> operation requires 
<RequestType> in POJO mode\").

Raised from an automated audit of the camel-aws components; filing for 
maintainer agreement on scope/packaging before the sweep.

----
_Reported by Claude Code on behalf of acosentino._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to