From 45402e6298e2483bee1d775b21d20cc5c2c1bc25 Mon Sep 17 00:00:00 2001 From: Jacob Summers Date: Mon, 16 Mar 2026 13:33:04 -0400 Subject: [PATCH] fix: add content example resolving for request bodies and parameters --- .../swagger/v3/parser/util/ResolverFully.java | 61 ++++++++----------- .../v3/parser/test/OpenAPIResolverTest.java | 36 ++++++++++- .../src/test/resources/issue-2292.yaml | 56 +++++++++++++++++ 3 files changed, 116 insertions(+), 37 deletions(-) create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-2292.yaml diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java index 777c7742f0..e00c3e3077 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java @@ -145,17 +145,7 @@ public void resolvePath(PathItem pathItem){ parameter.setSchema(resolved); } } - if(parameter.getContent() != null){ - Map content = parameter.getContent(); - for (String key: content.keySet()){ - if (content.get(key) != null && content.get(key).getSchema() != null ){ - Schema resolvedSchema = resolveSchema(content.get(key).getSchema()); - if (resolvedSchema != null) { - content.get(key).setSchema(resolvedSchema); - } - } - } - } + resolveContent(parameter.getContent()); } } @@ -181,17 +171,7 @@ public void resolvePath(PathItem pathItem){ if (refRequestBody != null){ RequestBody requestBody = refRequestBody.get$ref() != null ? resolveRequestBody(refRequestBody) : refRequestBody; op.setRequestBody(requestBody); - if (requestBody.getContent() != null) { - Map content = requestBody.getContent(); - for (String key : content.keySet()) { - if (content.get(key) != null && content.get(key).getSchema() != null) { - Schema resolved = resolveSchema(content.get(key).getSchema()); - if (resolved != null) { - content.get(key).setSchema(resolved); - } - } - } - } + resolveContent(requestBody.getContent()); } // responses ApiResponses responses = op.getResponses(); @@ -200,20 +180,7 @@ public void resolvePath(PathItem pathItem){ for(String code : responses.keySet()) { ApiResponse response = responses.get(code); response = response.get$ref() != null ? resolveResponse(response) : response; - if (response.getContent() != null) { - Map content = response.getContent(); - for(String mediaType: content.keySet()){ - if(content.get(mediaType).getSchema() != null) { - Schema resolved = resolveSchema(content.get(mediaType).getSchema()); - response.getContent().get(mediaType).setSchema(resolved); - } - if(content.get(mediaType).getExamples() != null) { - Map resolved = resolveExample(content.get(mediaType).getExamples()); - response.getContent().get(mediaType).setExamples(resolved); - - } - } - } + resolveContent(response.getContent()); resolveHeaders(response.getHeaders()); @@ -232,6 +199,28 @@ public void resolvePath(PathItem pathItem){ } } + private void resolveContent(Map content) { + if (content == null) { + return; + } + for (String key : content.keySet()) { + MediaType mediaType = content.get(key); + if (mediaType != null) { + Schema mediaTypeSchema = mediaType.getSchema(); + if (mediaTypeSchema != null) { + Schema resolved = resolveSchema(mediaTypeSchema); + if (resolved != null) { + mediaType.setSchema(resolved); + } + } + Map examples = mediaType.getExamples(); + if (examples != null) { + mediaType.setExamples(resolveExample(examples)); + } + } + } + } + private void resolveHeaders(Map headers) { if (headers == null || headers.isEmpty()) { return; diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java index ff1b353014..7ac1e1dadd 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java @@ -1500,5 +1500,39 @@ public Object[][] explicitObjectSchemaProvider() { { false } }; } - + + @Test + public void testIssue2292() { + ParseOptions options = new ParseOptions(); + options.setResolve(true); + options.setResolveFully(true); + + OpenAPI openAPI = new OpenAPIV3Parser().readLocation("/issue-2292.yaml", auths, options).getOpenAPI(); + + // Verify parameter content examples are resolved + Parameter filterParam = openAPI.getPaths().get("/users").getPost().getParameters().get(0); + Map paramExamples = filterParam.getContent().get("application/json").getExamples(); + Example resolvedFilterExample = paramExamples.get("simpleFilter"); + assertNotNull(resolvedFilterExample); + assertNull(resolvedFilterExample.get$ref()); + assertEquals("A sample filter", resolvedFilterExample.getSummary()); + + // Verify requestBody content examples are resolved + RequestBody requestBody = openAPI.getPaths().get("/users").getPost().getRequestBody(); + Map requestBodyExamples = requestBody.getContent().get("application/json").getExamples(); + Example resolvedUserExample = requestBodyExamples.get("defaultUser"); + assertNotNull(resolvedUserExample); + assertNull(resolvedUserExample.get$ref()); + assertEquals("A sample user", resolvedUserExample.getSummary()); + + // Verify response content examples are resolved + ApiResponse response = openAPI.getPaths().get("/users").getPost().getResponses().get("200"); + Map responseExamples = response.getContent().get("application/json").getExamples(); + Example resolvedResponseExample = responseExamples.get("successResponse"); + assertNotNull(resolvedResponseExample); + assertNull(resolvedResponseExample.get$ref()); + assertEquals("A sample user", resolvedResponseExample.getSummary()); + } + + } diff --git a/modules/swagger-parser-v3/src/test/resources/issue-2292.yaml b/modules/swagger-parser-v3/src/test/resources/issue-2292.yaml new file mode 100644 index 0000000000..e565bbbd71 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-2292.yaml @@ -0,0 +1,56 @@ +openapi: "3.0.3" +info: + title: Example Reference Demo API + version: "1.0" +paths: + /users: + post: + summary: Create a user + parameters: + - name: filter + in: query + content: + application/json: + schema: + type: object + examples: + simpleFilter: + $ref: "#/components/examples/FilterExample" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/User" + examples: + defaultUser: + $ref: "#/components/examples/UserExample" + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/User" + examples: + successResponse: + $ref: "#/components/examples/UserExample" +components: + schemas: + User: + type: object + properties: + id: + type: string + name: + type: string + examples: + UserExample: + summary: A sample user + value: + id: "12345" + name: John Doe + FilterExample: + summary: A sample filter + value: + status: active