Skip to content

Commit 36189a4

Browse files
committed
fix: add content example resolving for request bodies and parameters
1 parent 702586f commit 36189a4

3 files changed

Lines changed: 116 additions & 37 deletions

File tree

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -147,17 +147,7 @@ public void resolvePath(PathItem pathItem){
147147
parameter.setSchema(resolved);
148148
}
149149
}
150-
if(parameter.getContent() != null){
151-
Map<String,MediaType> content = parameter.getContent();
152-
for (String key: content.keySet()){
153-
if (content.get(key) != null && content.get(key).getSchema() != null ){
154-
Schema resolvedSchema = resolveSchema(content.get(key).getSchema());
155-
if (resolvedSchema != null) {
156-
content.get(key).setSchema(resolvedSchema);
157-
}
158-
}
159-
}
160-
}
150+
resolveContent(parameter.getContent());
161151
}
162152
}
163153

@@ -183,17 +173,7 @@ public void resolvePath(PathItem pathItem){
183173
if (refRequestBody != null){
184174
RequestBody requestBody = refRequestBody.get$ref() != null ? resolveRequestBody(refRequestBody) : refRequestBody;
185175
op.setRequestBody(requestBody);
186-
if (requestBody.getContent() != null) {
187-
Map<String, MediaType> content = requestBody.getContent();
188-
for (String key : content.keySet()) {
189-
if (content.get(key) != null && content.get(key).getSchema() != null) {
190-
Schema resolved = resolveSchema(content.get(key).getSchema());
191-
if (resolved != null) {
192-
content.get(key).setSchema(resolved);
193-
}
194-
}
195-
}
196-
}
176+
resolveContent(requestBody.getContent());
197177
}
198178
// responses
199179
ApiResponses responses = op.getResponses();
@@ -202,20 +182,7 @@ public void resolvePath(PathItem pathItem){
202182
for(String code : responses.keySet()) {
203183
ApiResponse response = responses.get(code);
204184
response = response.get$ref() != null ? resolveResponse(response) : response;
205-
if (response.getContent() != null) {
206-
Map<String, MediaType> content = response.getContent();
207-
for(String mediaType: content.keySet()){
208-
if(content.get(mediaType).getSchema() != null) {
209-
Schema resolved = resolveSchema(content.get(mediaType).getSchema());
210-
response.getContent().get(mediaType).setSchema(resolved);
211-
}
212-
if(content.get(mediaType).getExamples() != null) {
213-
Map<String,Example> resolved = resolveExample(content.get(mediaType).getExamples());
214-
response.getContent().get(mediaType).setExamples(resolved);
215-
216-
}
217-
}
218-
}
185+
resolveContent(response.getContent());
219186

220187
resolveHeaders(response.getHeaders());
221188

@@ -234,6 +201,28 @@ public void resolvePath(PathItem pathItem){
234201
}
235202
}
236203

204+
private void resolveContent(Map<String, MediaType> content) {
205+
if (content == null) {
206+
return;
207+
}
208+
for (String key : content.keySet()) {
209+
MediaType mediaType = content.get(key);
210+
if (mediaType != null) {
211+
Schema mediaTypeSchema = mediaType.getSchema();
212+
if (mediaTypeSchema != null) {
213+
Schema resolved = resolveSchema(mediaTypeSchema);
214+
if (resolved != null) {
215+
mediaType.setSchema(resolved);
216+
}
217+
}
218+
Map<String, Example> examples = mediaType.getExamples();
219+
if (examples != null) {
220+
mediaType.setExamples(resolveExample(examples));
221+
}
222+
}
223+
}
224+
}
225+
237226
private void resolveHeaders(Map<String, Header> headers) {
238227
if (headers == null || headers.isEmpty()) {
239228
return;

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1560,5 +1560,39 @@ public Object[][] explicitObjectSchemaProvider() {
15601560
{ false }
15611561
};
15621562
}
1563-
1563+
1564+
@Test
1565+
public void testIssue2292() {
1566+
ParseOptions options = new ParseOptions();
1567+
options.setResolve(true);
1568+
options.setResolveFully(true);
1569+
1570+
OpenAPI openAPI = new OpenAPIV3Parser().readLocation("/issue-2292.yaml", auths, options).getOpenAPI();
1571+
1572+
// Verify parameter content examples are resolved
1573+
Parameter filterParam = openAPI.getPaths().get("/users").getPost().getParameters().get(0);
1574+
Map<String, Example> paramExamples = filterParam.getContent().get("application/json").getExamples();
1575+
Example resolvedFilterExample = paramExamples.get("simpleFilter");
1576+
assertNotNull(resolvedFilterExample);
1577+
assertNull(resolvedFilterExample.get$ref());
1578+
assertEquals("A sample filter", resolvedFilterExample.getSummary());
1579+
1580+
// Verify requestBody content examples are resolved
1581+
RequestBody requestBody = openAPI.getPaths().get("/users").getPost().getRequestBody();
1582+
Map<String, Example> requestBodyExamples = requestBody.getContent().get("application/json").getExamples();
1583+
Example resolvedUserExample = requestBodyExamples.get("defaultUser");
1584+
assertNotNull(resolvedUserExample);
1585+
assertNull(resolvedUserExample.get$ref());
1586+
assertEquals("A sample user", resolvedUserExample.getSummary());
1587+
1588+
// Verify response content examples are resolved
1589+
ApiResponse response = openAPI.getPaths().get("/users").getPost().getResponses().get("200");
1590+
Map<String, Example> responseExamples = response.getContent().get("application/json").getExamples();
1591+
Example resolvedResponseExample = responseExamples.get("successResponse");
1592+
assertNotNull(resolvedResponseExample);
1593+
assertNull(resolvedResponseExample.get$ref());
1594+
assertEquals("A sample user", resolvedResponseExample.getSummary());
1595+
}
1596+
1597+
15641598
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
openapi: "3.0.3"
2+
info:
3+
title: Example Reference Demo API
4+
version: "1.0"
5+
paths:
6+
/users:
7+
post:
8+
summary: Create a user
9+
parameters:
10+
- name: filter
11+
in: query
12+
content:
13+
application/json:
14+
schema:
15+
type: object
16+
examples:
17+
simpleFilter:
18+
$ref: "#/components/examples/FilterExample"
19+
requestBody:
20+
required: true
21+
content:
22+
application/json:
23+
schema:
24+
$ref: "#/components/schemas/User"
25+
examples:
26+
defaultUser:
27+
$ref: "#/components/examples/UserExample"
28+
responses:
29+
"200":
30+
description: Success
31+
content:
32+
application/json:
33+
schema:
34+
$ref: "#/components/schemas/User"
35+
examples:
36+
successResponse:
37+
$ref: "#/components/examples/UserExample"
38+
components:
39+
schemas:
40+
User:
41+
type: object
42+
properties:
43+
id:
44+
type: string
45+
name:
46+
type: string
47+
examples:
48+
UserExample:
49+
summary: A sample user
50+
value:
51+
id: "12345"
52+
name: John Doe
53+
FilterExample:
54+
summary: A sample filter
55+
value:
56+
status: active

0 commit comments

Comments
 (0)