Skip to content

Commit bb49a87

Browse files
committed
fix: add content example resolving for request bodies and parameters
1 parent db452e0 commit bb49a87

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
@@ -145,17 +145,7 @@ public void resolvePath(PathItem pathItem){
145145
parameter.setSchema(resolved);
146146
}
147147
}
148-
if(parameter.getContent() != null){
149-
Map<String,MediaType> content = parameter.getContent();
150-
for (String key: content.keySet()){
151-
if (content.get(key) != null && content.get(key).getSchema() != null ){
152-
Schema resolvedSchema = resolveSchema(content.get(key).getSchema());
153-
if (resolvedSchema != null) {
154-
content.get(key).setSchema(resolvedSchema);
155-
}
156-
}
157-
}
158-
}
148+
resolveContent(parameter.getContent());
159149
}
160150
}
161151

@@ -181,17 +171,7 @@ public void resolvePath(PathItem pathItem){
181171
if (refRequestBody != null){
182172
RequestBody requestBody = refRequestBody.get$ref() != null ? resolveRequestBody(refRequestBody) : refRequestBody;
183173
op.setRequestBody(requestBody);
184-
if (requestBody.getContent() != null) {
185-
Map<String, MediaType> content = requestBody.getContent();
186-
for (String key : content.keySet()) {
187-
if (content.get(key) != null && content.get(key).getSchema() != null) {
188-
Schema resolved = resolveSchema(content.get(key).getSchema());
189-
if (resolved != null) {
190-
content.get(key).setSchema(resolved);
191-
}
192-
}
193-
}
194-
}
174+
resolveContent(requestBody.getContent());
195175
}
196176
// responses
197177
ApiResponses responses = op.getResponses();
@@ -200,20 +180,7 @@ public void resolvePath(PathItem pathItem){
200180
for(String code : responses.keySet()) {
201181
ApiResponse response = responses.get(code);
202182
response = response.get$ref() != null ? resolveResponse(response) : response;
203-
if (response.getContent() != null) {
204-
Map<String, MediaType> content = response.getContent();
205-
for(String mediaType: content.keySet()){
206-
if(content.get(mediaType).getSchema() != null) {
207-
Schema resolved = resolveSchema(content.get(mediaType).getSchema());
208-
response.getContent().get(mediaType).setSchema(resolved);
209-
}
210-
if(content.get(mediaType).getExamples() != null) {
211-
Map<String,Example> resolved = resolveExample(content.get(mediaType).getExamples());
212-
response.getContent().get(mediaType).setExamples(resolved);
213-
214-
}
215-
}
216-
}
183+
resolveContent(response.getContent());
217184

218185
resolveHeaders(response.getHeaders());
219186

@@ -232,6 +199,28 @@ public void resolvePath(PathItem pathItem){
232199
}
233200
}
234201

202+
private void resolveContent(Map<String, MediaType> content) {
203+
if (content == null) {
204+
return;
205+
}
206+
for (String key : content.keySet()) {
207+
MediaType mediaType = content.get(key);
208+
if (mediaType != null) {
209+
Schema mediaTypeSchema = mediaType.getSchema();
210+
if (mediaTypeSchema != null) {
211+
Schema resolved = resolveSchema(mediaTypeSchema);
212+
if (resolved != null) {
213+
mediaType.setSchema(resolved);
214+
}
215+
}
216+
Map<String, Example> examples = mediaType.getExamples();
217+
if (examples != null) {
218+
mediaType.setExamples(resolveExample(examples));
219+
}
220+
}
221+
}
222+
}
223+
235224
private void resolveHeaders(Map<String, Header> headers) {
236225
if (headers == null || headers.isEmpty()) {
237226
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
@@ -1500,5 +1500,39 @@ public Object[][] explicitObjectSchemaProvider() {
15001500
{ false }
15011501
};
15021502
}
1503-
1503+
1504+
@Test
1505+
public void testIssue2292() {
1506+
ParseOptions options = new ParseOptions();
1507+
options.setResolve(true);
1508+
options.setResolveFully(true);
1509+
1510+
OpenAPI openAPI = new OpenAPIV3Parser().readLocation("/issue-2292.yaml", auths, options).getOpenAPI();
1511+
1512+
// Verify parameter content examples are resolved
1513+
Parameter filterParam = openAPI.getPaths().get("/users").getPost().getParameters().get(0);
1514+
Map<String, Example> paramExamples = filterParam.getContent().get("application/json").getExamples();
1515+
Example resolvedFilterExample = paramExamples.get("simpleFilter");
1516+
assertNotNull(resolvedFilterExample);
1517+
assertNull(resolvedFilterExample.get$ref());
1518+
assertEquals("A sample filter", resolvedFilterExample.getSummary());
1519+
1520+
// Verify requestBody content examples are resolved
1521+
RequestBody requestBody = openAPI.getPaths().get("/users").getPost().getRequestBody();
1522+
Map<String, Example> requestBodyExamples = requestBody.getContent().get("application/json").getExamples();
1523+
Example resolvedUserExample = requestBodyExamples.get("defaultUser");
1524+
assertNotNull(resolvedUserExample);
1525+
assertNull(resolvedUserExample.get$ref());
1526+
assertEquals("A sample user", resolvedUserExample.getSummary());
1527+
1528+
// Verify response content examples are resolved
1529+
ApiResponse response = openAPI.getPaths().get("/users").getPost().getResponses().get("200");
1530+
Map<String, Example> responseExamples = response.getContent().get("application/json").getExamples();
1531+
Example resolvedResponseExample = responseExamples.get("successResponse");
1532+
assertNotNull(resolvedResponseExample);
1533+
assertNull(resolvedResponseExample.get$ref());
1534+
assertEquals("A sample user", resolvedResponseExample.getSummary());
1535+
}
1536+
1537+
15041538
}
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)