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 0d915a784cc9 CAMEL-24251: camel-aws2 - guard nullable 
awsErrorDetails() in producer health checks (#25089)
0d915a784cc9 is described below

commit 0d915a784cc9ccb69136c384d0e8be0cfb223672
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Jul 24 13:11:51 2026 +0200

    CAMEL-24251: camel-aws2 - guard nullable awsErrorDetails() in producer 
health checks (#25089)
    
    Every AWS producer health check catches AwsServiceException and records the 
HTTP
    status code and the AWS error code. The status code was guarded for null but
    awsErrorDetails() was dereferenced directly:
    
        if (ObjectHelper.isNotEmpty(e.statusCode())) {              // guarded
            builder.detail(SERVICE_STATUS_CODE, e.statusCode());
        }
        if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {   // 
NPE if details are null
            builder.detail(SERVICE_ERROR_CODE, e.awsErrorDetails().errorCode());
        }
    
    AwsServiceException.awsErrorDetails() is nullable. When such an exception 
reaches
    the block the health check throws
    
        NullPointerException: Cannot invoke "AwsErrorDetails.errorCode()" 
because the
        return value of "AwsServiceException.awsErrorDetails()" is null
    
    instead of reporting the endpoint DOWN with the message it had already 
prepared,
    turning a genuine "service unreachable" signal into a health-check failure.
    
    Guarded awsErrorDetails() consistently with the neighbouring statusCode() 
check
    across all 21 producer health checks. Textract additionally dereferenced it 
in an
    equals() test that classifies certain errors as healthy, so it now reads the
    error code once into a local.
    
    Added Athena2ProducerHealthCheckErrorDetailsTest covering both the 
null-details
    case (DOWN, no error-code detail) and the populated case (error code still
    reported).
    
    Signed-off-by: Andrea Cosentino <[email protected]>
    Co-authored-by: Claude Opus 4.8 <[email protected]>
---
 .../aws/config/AWSConfigProducerHealthCheck.java   |  2 +-
 .../ParameterStoreProducerHealthCheck.java         |  2 +-
 .../SecretsManagerProducerHealthCheck.java         |  2 +-
 .../SecurityHubProducerHealthCheck.java            |  2 +-
 components/camel-aws/camel-aws2-athena/pom.xml     |  5 ++
 .../aws2/athena/Athena2ProducerHealthCheck.java    |  2 +-
 ...Athena2ProducerHealthCheckErrorDetailsTest.java | 77 ++++++++++++++++++++++
 .../comprehend/Comprehend2ProducerHealthCheck.java |  2 +-
 .../component/aws2/cw/Cw2ProducerHealthCheck.java  |  2 +-
 .../component/aws2/ddb/Db2ProducerHealthCheck.java |  2 +-
 .../aws2/ec2/AWS2EC2ProducerHealthCheck.java       |  2 +-
 .../aws2/ecs/ECS2ProducerHealthCheck.java          |  2 +-
 .../aws2/eks/EKS2ProducerHealthCheck.java          |  2 +-
 .../EventbridgeProducerHealthCheck.java            |  2 +-
 .../aws2/lambda/Lambda2ProducerHealthCheck.java    |  2 +-
 .../component/aws2/mq/MQ2ProducerHealthCheck.java  |  2 +-
 .../aws2/polly/Polly2ProducerHealthCheck.java      |  2 +-
 .../Rekognition2ProducerHealthCheck.java           |  2 +-
 .../StepFunctions2ProducerHealthCheck.java         |  2 +-
 .../textract/Textract2ProducerHealthCheck.java     |  9 +--
 .../query/Timestream2QueryProducerHealthCheck.java |  2 +-
 .../write/Timestream2WriteProducerHealthCheck.java |  2 +-
 .../translate/Translate2ProducerHealthCheck.java   |  2 +-
 23 files changed, 107 insertions(+), 24 deletions(-)

diff --git 
a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
 
b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
index 8b33b067d21b..f881e1644773 100644
--- 
a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class AWSConfigProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
 
b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
index 7fa7fd9bd9ec..881a8a4b69fa 100644
--- 
a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class ParameterStoreProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
index 913d78d45d32..5c45de40402c 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class SecretsManagerProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
 
b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
index 3f262e92abef..8ea14cc765bf 100644
--- 
a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
@@ -54,7 +54,7 @@ public class SecurityHubProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git a/components/camel-aws/camel-aws2-athena/pom.xml 
b/components/camel-aws/camel-aws2-athena/pom.xml
index 1048efd4f173..c6f67b9c6290 100644
--- a/components/camel-aws/camel-aws2-athena/pom.xml
+++ b/components/camel-aws/camel-aws2-athena/pom.xml
@@ -89,5 +89,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-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
index 95796de78e78..400808d8cceb 100644
--- 
a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Athena2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheckErrorDetailsTest.java
 
b/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheckErrorDetailsTest.java
new file mode 100644
index 000000000000..b6aa71ca81d5
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheckErrorDetailsTest.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.athena;
+
+import org.apache.camel.health.HealthCheck;
+import org.apache.camel.impl.health.AbstractHealthCheck;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.awscore.exception.AwsErrorDetails;
+import software.amazon.awssdk.awscore.exception.AwsServiceException;
+import software.amazon.awssdk.services.athena.AthenaClient;
+import software.amazon.awssdk.services.athena.model.ListQueryExecutionsRequest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * {@link AwsServiceException#awsErrorDetails()} is nullable, so the health 
check must not dereference it blindly when
+ * recording the AWS error code.
+ */
+class Athena2ProducerHealthCheckErrorDetailsTest {
+
+    @Test
+    void reportsDownWithoutFailingWhenTheExceptionCarriesNoErrorDetails() {
+        HealthCheck.Result result = callHealthCheckThrowing(
+                
AwsServiceException.builder().message("boom").statusCode(500).build());
+
+        assertThat(result.getState()).isEqualTo(HealthCheck.State.DOWN);
+        assertThat(result.getMessage()).contains("boom");
+        
assertThat(result.getDetails()).containsEntry(AbstractHealthCheck.SERVICE_STATUS_CODE,
 500);
+        // there were no error details to report, so the detail is simply 
absent
+        
assertThat(result.getDetails()).doesNotContainKey(AbstractHealthCheck.SERVICE_ERROR_CODE);
+    }
+
+    @Test
+    void stillReportsTheErrorCodeWhenTheExceptionCarriesErrorDetails() {
+        HealthCheck.Result result = callHealthCheckThrowing(
+                AwsServiceException.builder()
+                        .message("boom")
+                        .statusCode(400)
+                        .awsErrorDetails(AwsErrorDetails.builder()
+                                .errorCode("InvalidRequestException")
+                                .build())
+                        .build());
+
+        assertThat(result.getState()).isEqualTo(HealthCheck.State.DOWN);
+        assertThat(result.getDetails())
+                .containsEntry(AbstractHealthCheck.SERVICE_ERROR_CODE, 
"InvalidRequestException");
+    }
+
+    private HealthCheck.Result callHealthCheckThrowing(AwsServiceException 
exception) {
+        AthenaClient client = mock(AthenaClient.class);
+        
when(client.listQueryExecutions(any(ListQueryExecutionsRequest.class))).thenThrow(exception);
+
+        Athena2Endpoint endpoint = mock(Athena2Endpoint.class);
+        // a null region skips the region check and takes the health check 
straight to the client call
+        when(endpoint.getConfiguration()).thenReturn(new 
Athena2Configuration());
+        when(endpoint.getAthenaClient()).thenReturn(client);
+
+        return new Athena2ProducerHealthCheck(endpoint, "test").call();
+    }
+}
diff --git 
a/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
index 81f1aa731356..0e5a43b7d77b 100644
--- 
a/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Comprehend2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
index ddda2736370b..01c75ad8231c 100644
--- 
a/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Cw2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
index d2b353044ed4..718e30b45736 100644
--- 
a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Db2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
index 2fd3e1348aa6..bf350fe61fca 100644
--- 
a/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
@@ -54,7 +54,7 @@ public class AWS2EC2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
index 49a3590bd2bd..44638fde8d26 100644
--- 
a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class ECS2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
index 91632c4f8030..edb52806c296 100644
--- 
a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class EKS2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
index d306f0d0b074..d8c94a85dbf2 100644
--- 
a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class EventbridgeProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
index a1e71a31a88a..93fa9977ca8d 100644
--- 
a/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Lambda2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
index 654c5d0fb530..20ea38bf146c 100644
--- 
a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class MQ2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
index 7cd6205fa8b5..70a25053133d 100644
--- 
a/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Polly2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
index e625aeb30352..a18b05b89300 100644
--- 
a/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Rekognition2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
index e1a7114b8522..e5aefc64e4ec 100644
--- 
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class StepFunctions2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
index 5dc04f71c0dc..3c5e56e52285 100644
--- 
a/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
@@ -62,9 +62,10 @@ public class Textract2ProducerHealthCheck extends 
AbstractHealthCheck {
             // This will likely fail because "test" is not a valid document, 
but it will validate credentials and connectivity
             textractClient.detectDocumentText(testRequest);
         } catch (AwsServiceException e) {
+            // awsErrorDetails() is nullable, so read the error code 
defensively before using it below
+            String errorCode = e.awsErrorDetails() != null ? 
e.awsErrorDetails().errorCode() : null;
             // For health check, we consider certain errors as "healthy" since 
they indicate the service is reachable
-            if 
("InvalidParameterException".equals(e.awsErrorDetails().errorCode()) ||
-                    
"UnsupportedDocumentException".equals(e.awsErrorDetails().errorCode())) {
+            if ("InvalidParameterException".equals(errorCode) || 
"UnsupportedDocumentException".equals(errorCode)) {
                 // These errors mean the service is reachable but our test 
document is invalid - this is expected
                 builder.up();
                 return;
@@ -75,8 +76,8 @@ public class Textract2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
-                builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
+            if (ObjectHelper.isNotEmpty(errorCode)) {
+                builder.detail(SERVICE_ERROR_CODE, errorCode);
             }
             builder.down();
             return;
diff --git 
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
index 4654180c7fcd..2c9ab44bff8b 100644
--- 
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
@@ -56,7 +56,7 @@ public class Timestream2QueryProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
index d2abd6a04823..947a9d97951d 100644
--- 
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
@@ -56,7 +56,7 @@ public class Timestream2WriteProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();
diff --git 
a/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
 
b/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
index 431d6ef9045a..6c34f710e2e2 100644
--- 
a/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
+++ 
b/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Translate2ProducerHealthCheck extends 
AbstractHealthCheck {
             if (ObjectHelper.isNotEmpty(e.statusCode())) {
                 builder.detail(SERVICE_STATUS_CODE, e.statusCode());
             }
-            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) && 
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
                 builder.detail(SERVICE_ERROR_CODE, 
e.awsErrorDetails().errorCode());
             }
             builder.down();

Reply via email to