This is an automated email from the ASF dual-hosted git repository.
oscerd 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 d440e87e1637 CAMEL-24304: camel-aws2-step-functions - throw when
pojoRequest=true and the body is the wrong type
d440e87e1637 is described below
commit d440e87e1637dfd5a211705a6bed65a613e2702e
Author: Andrea Cosentino <[email protected]>
AuthorDate: Wed Jul 29 21:50:13 2026 +0200
CAMEL-24304: camel-aws2-step-functions - throw when pojoRequest=true and
the body is the wrong type
Child of CAMEL-24261 (completing CAMEL-23462 across the AWS2 producers).
StepFunctions2Producer's sixteen operations (state machines, activities,
executions) only acted when the body was the matching request type under
pojoRequest=true; any other body silently fell through with no AWS call and
no
error. Each branch now throws IllegalArgumentException naming the required
request type, consistent with the CAMEL-23462 Bedrock fix. A parameterized
test
covers all sixteen operations. Behaviour change documented in the 4.22
upgrade
guide (added with CAMEL-24263). Main only, matching the CAMEL-23462
precedent.
Closes #25229
Co-authored-by: Claude Opus 4.8 <[email protected]>
---
.../camel-aws/camel-aws2-step-functions/pom.xml | 5 ++
.../aws2/stepfunctions/StepFunctions2Producer.java | 48 ++++++++++++++++++
.../stepfunctions/StepFunctions2ProducerTest.java | 58 ++++++++++++++++++++++
3 files changed, 111 insertions(+)
diff --git a/components/camel-aws/camel-aws2-step-functions/pom.xml
b/components/camel-aws/camel-aws2-step-functions/pom.xml
index 90f223982f04..846055db208e 100644
--- a/components/camel-aws/camel-aws2-step-functions/pom.xml
+++ b/components/camel-aws/camel-aws2-step-functions/pom.xml
@@ -80,6 +80,11 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
diff --git
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Producer.java
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Producer.java
index 3442f855efa3..2734d4a535e9 100644
---
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Producer.java
+++
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Producer.java
@@ -111,6 +111,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "createStateMachine operation requires
CreateStateMachineRequest in POJO mode");
}
} else {
CreateStateMachineRequest.Builder builder =
CreateStateMachineRequest.builder();
@@ -164,6 +167,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "deleteStateMachine operation requires
DeleteStateMachineRequest in POJO mode");
}
} else {
DeleteStateMachineRequest.Builder builder =
DeleteStateMachineRequest.builder();
@@ -198,6 +204,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "updateStateMachine operation requires
UpdateStateMachineRequest in POJO mode");
}
} else {
UpdateStateMachineRequest.Builder builder =
UpdateStateMachineRequest.builder();
@@ -241,6 +250,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "describeStateMachine operation requires
DescribeStateMachineRequest in POJO mode");
}
} else {
DescribeStateMachineRequest.Builder builder =
DescribeStateMachineRequest.builder();
@@ -274,6 +286,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "listStateMachines operation requires
ListStateMachinesRequest in POJO mode");
}
} else {
ListStateMachinesRequest.Builder builder =
ListStateMachinesRequest.builder();
@@ -307,6 +322,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "createActivity operation requires
CreateActivityRequest in POJO mode");
}
} else {
CreateActivityRequest.Builder builder =
CreateActivityRequest.builder();
@@ -340,6 +358,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "deleteActivity operation requires
DeleteActivityRequest in POJO mode");
}
} else {
DeleteActivityRequest.Builder builder =
DeleteActivityRequest.builder();
@@ -373,6 +394,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "describeActivity operation requires
DescribeActivityRequest in POJO mode");
}
} else {
DescribeActivityRequest.Builder builder =
DescribeActivityRequest.builder();
@@ -406,6 +430,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "getActivityTask operation requires
GetActivityTaskRequest in POJO mode");
}
} else {
GetActivityTaskRequest.Builder builder =
GetActivityTaskRequest.builder();
@@ -439,6 +466,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "listActivities operation requires
ListActivitiesRequest in POJO mode");
}
} else {
ListActivitiesRequest.Builder builder =
ListActivitiesRequest.builder();
@@ -472,6 +502,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "startExecution operation requires
StartExecutionRequest in POJO mode");
}
} else {
StartExecutionRequest.Builder builder =
StartExecutionRequest.builder();
@@ -518,6 +551,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "startSyncExecution operation requires
StartSyncExecutionRequest in POJO mode");
}
} else {
StartSyncExecutionRequest.Builder builder =
StartSyncExecutionRequest.builder();
@@ -564,6 +600,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "stopExecution operation requires StopExecutionRequest
in POJO mode");
}
} else {
StopExecutionRequest.Builder builder =
StopExecutionRequest.builder();
@@ -597,6 +636,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "describeExecution operation requires
DescribeExecutionRequest in POJO mode");
}
} else {
DescribeExecutionRequest.Builder builder =
DescribeExecutionRequest.builder();
@@ -630,6 +672,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "listExecutions operation requires
ListExecutionsRequest in POJO mode");
}
} else {
ListExecutionsRequest.Builder builder =
ListExecutionsRequest.builder();
@@ -667,6 +712,9 @@ public class StepFunctions2Producer extends DefaultProducer
{
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "getExecutionHistory operation requires
GetExecutionHistoryRequest in POJO mode");
}
} else {
GetExecutionHistoryRequest.Builder builder =
GetExecutionHistoryRequest.builder();
diff --git
a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerTest.java
b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerTest.java
index 5d14b2db3ad1..adbb04995be9 100644
---
a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerTest.java
+++
b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerTest.java
@@ -26,8 +26,11 @@ import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit6.CamelTestSupport;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
import software.amazon.awssdk.services.sfn.model.*;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -339,6 +342,31 @@ public class StepFunctions2ProducerTest extends
CamelTestSupport {
assertEquals(1L, resultGet.events().get(0).id());
}
+ @ParameterizedTest
+ @CsvSource({
+ "direct:createStateMachinePojo,createStateMachine operation
requires CreateStateMachineRequest in POJO mode",
+ "direct:deleteStateMachinePojo,deleteStateMachine operation
requires DeleteStateMachineRequest in POJO mode",
+ "direct:updateStateMachinePojo,updateStateMachine operation
requires UpdateStateMachineRequest in POJO mode",
+ "direct:describeStateMachinePojo,describeStateMachine operation
requires DescribeStateMachineRequest in POJO mode",
+ "direct:listStateMachinesPojo,listStateMachines operation requires
ListStateMachinesRequest in POJO mode",
+ "direct:createPojoActivity,createActivity operation requires
CreateActivityRequest in POJO mode",
+ "direct:deleteActivityPojo,deleteActivity operation requires
DeleteActivityRequest in POJO mode",
+ "direct:describeActivityPojo,describeActivity operation requires
DescribeActivityRequest in POJO mode",
+ "direct:getActivityTaskPojo,getActivityTask operation requires
GetActivityTaskRequest in POJO mode",
+ "direct:listActivitiesPojo,listActivities operation requires
ListActivitiesRequest in POJO mode",
+ "direct:startExecutionPojo,startExecution operation requires
StartExecutionRequest in POJO mode",
+ "direct:startSyncExecutionPojo,startSyncExecution operation
requires StartSyncExecutionRequest in POJO mode",
+ "direct:stopExecutionPojo,stopExecution operation requires
StopExecutionRequest in POJO mode",
+ "direct:describeExecutionPojo,describeExecution operation requires
DescribeExecutionRequest in POJO mode",
+ "direct:listExecutionsPojo,listExecutions operation requires
ListExecutionsRequest in POJO mode",
+ "direct:getExecutionHistoryPojo,getExecutionHistory operation
requires GetExecutionHistoryRequest in POJO mode",
+ })
+ void pojoRequestWithWrongBodyTypeThrows(String route, String
expectedMessage) {
+ assertThatThrownBy(() -> template.requestBody(route, "not the expected
request type"))
+ .hasRootCauseInstanceOf(IllegalArgumentException.class)
+ .hasRootCauseMessage(expectedMessage);
+ }
+
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@@ -394,6 +422,36 @@ public class StepFunctions2ProducerTest extends
CamelTestSupport {
from("direct:describeStateMachine")
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=describeStateMachine")
.to("mock:result");
+ from("direct:createStateMachinePojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=createStateMachine&pojoRequest=true");
+ from("direct:deleteStateMachinePojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=deleteStateMachine&pojoRequest=true");
+ from("direct:updateStateMachinePojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=updateStateMachine&pojoRequest=true");
+ from("direct:describeStateMachinePojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=describeStateMachine&pojoRequest=true");
+ from("direct:listStateMachinesPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=listStateMachines&pojoRequest=true");
+ from("direct:deleteActivityPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=deleteActivity&pojoRequest=true");
+ from("direct:describeActivityPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=describeActivity&pojoRequest=true");
+ from("direct:getActivityTaskPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=getActivityTask&pojoRequest=true");
+ from("direct:listActivitiesPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=listActivities&pojoRequest=true");
+ from("direct:startExecutionPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=startExecution&pojoRequest=true");
+ from("direct:startSyncExecutionPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=startSyncExecution&pojoRequest=true");
+ from("direct:stopExecutionPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=stopExecution&pojoRequest=true");
+ from("direct:describeExecutionPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=describeExecution&pojoRequest=true");
+ from("direct:listExecutionsPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=listExecutions&pojoRequest=true");
+ from("direct:getExecutionHistoryPojo")
+
.to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=getExecutionHistory&pojoRequest=true");
}
};
}