You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/10/15 14:38:16 UTC

(camel) branch main updated: CAMEL-25663: camel-rest-openapi - mock mode no longer NPEs for an operation without a 200 response (#27897)

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 76d70c0905a9 CAMEL-25663: camel-rest-openapi - mock mode no longer NPEs for an operation without a 200 response (#27897)
76d70c0905a9 is described below

commit 76d70c0905a9f6f18f67a90243ca7e3852635406
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Oct 15 16:38:09 2026 +0200

    CAMEL-25663: camel-rest-openapi - mock mode no longer NPEs for an operation without a 200 response (#27897)
    
    Co-Authored-By: Claude Opus 4.8 <no...@anthropic.com>
---
 .../DefaultRestOpenapiProcessorStrategy.java       |  8 +++++--
 .../openapi/RestOpenapiProcessorStrategyTest.java  | 25 ++++++++++++++++++++++
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/DefaultRestOpenapiProcessorStrategy.java b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/DefaultRestOpenapiProcessorStrategy.java
index 9478ecad5ba8..bd27d14c96cd 100644
--- a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/DefaultRestOpenapiProcessorStrategy.java
+++ b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/DefaultRestOpenapiProcessorStrategy.java
@@ -269,7 +269,8 @@ public class DefaultRestOpenapiProcessorStrategy extends ServiceSupport
         });
     }
 
-    private void loadMockData(Operation operation, String verb, String path, Exchange exchange) {
+    // package-private for testing (CAMEL-25663)
+    void loadMockData(Operation operation, String verb, String path, Exchange exchange) {
         final PackageScanResourceResolver resolver = PluginHelper.getPackageScanResourceResolver(camelContext);
         final String[] includes = mockIncludePattern != null ? mockIncludePattern.split(",") : null;
 
@@ -333,8 +334,11 @@ public class DefaultRestOpenapiProcessorStrategy extends ServiceSupport
                 String contentType = ExchangeHelper.getContentType(exchange);
                 String accept = exchange.getMessage().getHeader("Accept", String.class);
                 if (operation.getResponses() != null) {
+                    // CAMEL-25663: an operation whose responses have no 200 (for example only 201, 204, default or
+                    // 2XX) has a null ApiResponse here; treat it like a response without content so the mock returns
+                    // an empty 204 body instead of throwing a NullPointerException
                     ApiResponse a = operation.getResponses().get("200");
-                    Content c = a.getContent();
+                    Content c = a != null ? a.getContent() : null;
                     if (c != null && !c.isEmpty()) {
                         // prefer media-type that is the same as the incoming content-type
                         // if none found, then find first matching content-type from the HTTP Accept header
diff --git a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenapiProcessorStrategyTest.java b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenapiProcessorStrategyTest.java
index 54dc21d2d39e..96ab4f93032b 100644
--- a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenapiProcessorStrategyTest.java
+++ b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenapiProcessorStrategyTest.java
@@ -18,12 +18,16 @@ package org.apache.camel.component.rest.openapi;
 
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.Operation;
+import io.swagger.v3.oas.models.responses.ApiResponse;
+import io.swagger.v3.oas.models.responses.ApiResponses;
 import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.platform.http.PlatformHttpComponent;
 import org.apache.camel.component.platform.http.spi.PlatformHttpConsumerAware;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.support.DefaultExchange;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -88,6 +92,27 @@ class RestOpenapiProcessorStrategyTest extends ManagedCamelTestSupport {
         assertEquals("GENOPID_GET.user._id_", userByIdOp.getOperationId());
     }
 
+    @Test
+    void testMockModeWithoutOkResponseReturnsEmpty204() {
+        // CAMEL-25663: an operation whose responses have no 200 (only default, 201, 204, ...) must not throw a
+        // NullPointerException in mock mode; with no mock data it returns an empty 204.
+        DefaultRestOpenapiProcessorStrategy strategy = new DefaultRestOpenapiProcessorStrategy();
+        strategy.setCamelContext(camelContext);
+
+        Operation onlyDefault = new Operation()
+                .responses(new ApiResponses().addApiResponse("default", new ApiResponse()));
+        Exchange exchange = new DefaultExchange(camelContext);
+        assertDoesNotThrow(() -> strategy.loadMockData(onlyDefault, "GET", "/x", exchange));
+        assertEquals(204, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE, int.class));
+        assertEquals("", exchange.getMessage().getBody());
+
+        Operation only201 = new Operation()
+                .responses(new ApiResponses().addApiResponse("201", new ApiResponse()));
+        Exchange exchange201 = new DefaultExchange(camelContext);
+        assertDoesNotThrow(() -> strategy.loadMockData(only201, "GET", "/x", exchange201));
+        assertEquals(204, exchange201.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE, int.class));
+    }
+
     private OpenAPI getOpenApi() {
         return RestOpenApiEndpoint.loadSpecificationFrom(camelContext, "missing-opid.yaml");
     }