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 d908eff42a7b CAMEL-24283: camel-aws2-comprehend - throw when
pojoRequest=true and the body is the wrong type (#25194)
d908eff42a7b is described below
commit d908eff42a7bccbde77663bc77f3fc8c1f8c94e5
Author: Andrea Cosentino <[email protected]>
AuthorDate: Tue Jul 28 15:01:24 2026 +0200
CAMEL-24283: camel-aws2-comprehend - throw when pojoRequest=true and the
body is the wrong type (#25194)
Child of CAMEL-24261. Comprehend2Producer's nine operations
(detectDominantLanguage,
detectEntities, detectKeyPhrases, detectSentiment, detectSyntax,
detectPiiEntities,
detectToxicContent, classifyDocument, containsPiiEntities) 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. Add the missing else that throws
IllegalArgumentException naming the required type, consistent with
CAMEL-23462.
A parameterized test covers all nine operations, sending a wrong-typed body
to
pojoRequest=true routes and asserting the message; verified to fail (silent
no-op)
before the fix. The shared 4.22 upgrade-guide entry was added with
CAMEL-24263.
Signed-off-by: Andrea Cosentino <[email protected]>
Co-authored-by: Claude Opus 4.8 <[email protected]>
---
components/camel-aws/camel-aws2-comprehend/pom.xml | 5 ++++
.../aws2/comprehend/Comprehend2Producer.java | 27 +++++++++++++++++
.../aws2/comprehend/Comprehend2ProducerTest.java | 35 ++++++++++++++++++++++
3 files changed, 67 insertions(+)
diff --git a/components/camel-aws/camel-aws2-comprehend/pom.xml
b/components/camel-aws/camel-aws2-comprehend/pom.xml
index e1633f93e4f7..65ff9100df6b 100644
--- a/components/camel-aws/camel-aws2-comprehend/pom.xml
+++ b/components/camel-aws/camel-aws2-comprehend/pom.xml
@@ -78,5 +78,10 @@
<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-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2Producer.java
b/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2Producer.java
index 6ba657380b8f..9c36499c663e 100644
---
a/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2Producer.java
+++
b/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2Producer.java
@@ -147,6 +147,9 @@ public class Comprehend2Producer extends DefaultProducer {
message.setHeader(Comprehend2Constants.DETECTED_LANGUAGE,
topLanguage.languageCode());
message.setHeader(Comprehend2Constants.DETECTED_LANGUAGE_SCORE,
topLanguage.score());
}
+ } else {
+ throw new IllegalArgumentException(
+ "detectDominantLanguage operation requires
DetectDominantLanguageRequest in POJO mode");
}
} else {
DetectDominantLanguageRequest.Builder request =
DetectDominantLanguageRequest.builder();
@@ -181,6 +184,9 @@ public class Comprehend2Producer extends DefaultProducer {
}
Message message = getMessageForResponse(exchange);
message.setBody(result.entities());
+ } else {
+ throw new IllegalArgumentException(
+ "detectEntities operation requires
DetectEntitiesRequest in POJO mode");
}
} else {
DetectEntitiesRequest.Builder request =
DetectEntitiesRequest.builder();
@@ -211,6 +217,9 @@ public class Comprehend2Producer extends DefaultProducer {
}
Message message = getMessageForResponse(exchange);
message.setBody(result.keyPhrases());
+ } else {
+ throw new IllegalArgumentException(
+ "detectKeyPhrases operation requires
DetectKeyPhrasesRequest in POJO mode");
}
} else {
DetectKeyPhrasesRequest.Builder request =
DetectKeyPhrasesRequest.builder();
@@ -243,6 +252,9 @@ public class Comprehend2Producer extends DefaultProducer {
message.setBody(result);
message.setHeader(Comprehend2Constants.DETECTED_SENTIMENT,
result.sentimentAsString());
message.setHeader(Comprehend2Constants.DETECTED_SENTIMENT_SCORE,
result.sentimentScore());
+ } else {
+ throw new IllegalArgumentException(
+ "detectSentiment operation requires
DetectSentimentRequest in POJO mode");
}
} else {
DetectSentimentRequest.Builder request =
DetectSentimentRequest.builder();
@@ -275,6 +287,9 @@ public class Comprehend2Producer extends DefaultProducer {
}
Message message = getMessageForResponse(exchange);
message.setBody(result.syntaxTokens());
+ } else {
+ throw new IllegalArgumentException(
+ "detectSyntax operation requires DetectSyntaxRequest
in POJO mode");
}
} else {
DetectSyntaxRequest.Builder request =
DetectSyntaxRequest.builder();
@@ -305,6 +320,9 @@ public class Comprehend2Producer extends DefaultProducer {
}
Message message = getMessageForResponse(exchange);
message.setBody(result.entities());
+ } else {
+ throw new IllegalArgumentException(
+ "detectPiiEntities operation requires
DetectPiiEntitiesRequest in POJO mode");
}
} else {
DetectPiiEntitiesRequest.Builder request =
DetectPiiEntitiesRequest.builder();
@@ -335,6 +353,9 @@ public class Comprehend2Producer extends DefaultProducer {
}
Message message = getMessageForResponse(exchange);
message.setBody(result.resultList());
+ } else {
+ throw new IllegalArgumentException(
+ "detectToxicContent operation requires
DetectToxicContentRequest in POJO mode");
}
} else {
DetectToxicContentRequest.Builder request =
DetectToxicContentRequest.builder();
@@ -366,6 +387,9 @@ public class Comprehend2Producer extends DefaultProducer {
}
Message message = getMessageForResponse(exchange);
message.setBody(result);
+ } else {
+ throw new IllegalArgumentException(
+ "classifyDocument operation requires
ClassifyDocumentRequest in POJO mode");
}
} else {
ClassifyDocumentRequest.Builder request =
ClassifyDocumentRequest.builder();
@@ -400,6 +424,9 @@ public class Comprehend2Producer extends DefaultProducer {
}
Message message = getMessageForResponse(exchange);
message.setBody(result.labels());
+ } else {
+ throw new IllegalArgumentException(
+ "containsPiiEntities operation requires
ContainsPiiEntitiesRequest in POJO mode");
}
} else {
ContainsPiiEntitiesRequest.Builder request =
ContainsPiiEntitiesRequest.builder();
diff --git
a/components/camel-aws/camel-aws2-comprehend/src/test/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerTest.java
b/components/camel-aws/camel-aws2-comprehend/src/test/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerTest.java
index 85918b65c557..cbf5f2d1916f 100644
---
a/components/camel-aws/camel-aws2-comprehend/src/test/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerTest.java
+++
b/components/camel-aws/camel-aws2-comprehend/src/test/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerTest.java
@@ -26,6 +26,8 @@ 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.comprehend.model.DetectDominantLanguageRequest;
import software.amazon.awssdk.services.comprehend.model.DetectSentimentRequest;
import
software.amazon.awssdk.services.comprehend.model.DetectSentimentResponse;
@@ -35,6 +37,7 @@ import
software.amazon.awssdk.services.comprehend.model.KeyPhrase;
import software.amazon.awssdk.services.comprehend.model.PiiEntity;
import software.amazon.awssdk.services.comprehend.model.SyntaxToken;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -222,6 +225,24 @@ public class Comprehend2ProducerTest extends
CamelTestSupport {
assertFalse(results.isEmpty());
}
+ @ParameterizedTest
+ @CsvSource({
+ "direct:detectDominantLanguagePojo,detectDominantLanguage
operation requires DetectDominantLanguageRequest in POJO mode",
+ "direct:detectEntitiesPojo,detectEntities operation requires
DetectEntitiesRequest in POJO mode",
+ "direct:detectKeyPhrasesPojo,detectKeyPhrases operation requires
DetectKeyPhrasesRequest in POJO mode",
+ "direct:detectSentimentPojo,detectSentiment operation requires
DetectSentimentRequest in POJO mode",
+ "direct:detectSyntaxPojo,detectSyntax operation requires
DetectSyntaxRequest in POJO mode",
+ "direct:detectPiiEntitiesPojo,detectPiiEntities operation requires
DetectPiiEntitiesRequest in POJO mode",
+ "direct:detectToxicContentPojo,detectToxicContent operation
requires DetectToxicContentRequest in POJO mode",
+ "direct:classifyDocumentPojo,classifyDocument operation requires
ClassifyDocumentRequest in POJO mode",
+ "direct:containsPiiEntitiesPojo,containsPiiEntities operation
requires ContainsPiiEntitiesRequest 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() {
@@ -254,6 +275,20 @@ public class Comprehend2ProducerTest extends
CamelTestSupport {
from("direct:detectToxicContent")
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=detectToxicContent&languageCode=en")
.to("mock:result");
+ from("direct:detectEntitiesPojo")
+
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=detectEntities&pojoRequest=true");
+ from("direct:detectKeyPhrasesPojo")
+
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=detectKeyPhrases&pojoRequest=true");
+ from("direct:detectSyntaxPojo")
+
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=detectSyntax&pojoRequest=true");
+ from("direct:detectPiiEntitiesPojo")
+
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=detectPiiEntities&pojoRequest=true");
+ from("direct:detectToxicContentPojo")
+
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=detectToxicContent&pojoRequest=true");
+ from("direct:classifyDocumentPojo")
+
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=classifyDocument&pojoRequest=true");
+ from("direct:containsPiiEntitiesPojo")
+
.to("aws2-comprehend://test?comprehendClient=#amazonComprehendClient&operation=containsPiiEntities&pojoRequest=true");
}
};
}