Skip to content

Commit 285907c

Browse files
authored
Merge pull request #2052 from swagger-api/issue-2037
Fix issue #2037
2 parents d380fbf + 89be06a commit 285907c

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/PathsProcessor.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ protected void updateRefs(ApiResponse response, String pathRef) {
172172
if(response.getContent() != null) {
173173
Map<String, MediaType> content = response.getContent();
174174
for (String key: content.keySet()) {
175+
MediaType mediaType = content.get(key);
176+
if (mediaType.getSchema() != null) {
177+
updateRefs(mediaType.getSchema(), pathRef);
178+
}
175179
Map<String, Example> examples = content.get(key).getExamples();
176180
if (examples != null) {
177181
for( Example example:examples.values()){
@@ -285,10 +289,18 @@ protected boolean isAbsoluteRef(String ref) {
285289
return false;
286290
}
287291

292+
private boolean isInternalSchemaRef(String $ref) {
293+
if($ref.startsWith("#/components/schemas")) {
294+
return true;
295+
}
296+
return false;
297+
}
298+
288299
protected String computeRef(String ref, String prefix) {
289-
if(isLocalRef(ref)) return computeLocalRef(ref, prefix);
290-
if(isAbsoluteRef(ref)) return ref;
291-
return computeRelativeRef(ref, prefix);
300+
if(isLocalRef(ref)&& !isInternalSchemaRef(ref)) return computeLocalRef(ref, prefix);
301+
if(isAbsoluteRef(ref)) return ref;
302+
if(isInternalSchemaRef(ref)) return ref;
303+
return computeRelativeRef(ref, prefix);
292304
}
293305

294306
protected String computeRelativeRef(String ref, String prefix) {

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

+12
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@
4343
public class OpenAPIV3ParserTest {
4444
List<AuthorizationValue> auths = new ArrayList<>();
4545

46+
@Test
47+
public void testFailedToResolveResponseReferences() {
48+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
49+
ParseOptions options = new ParseOptions();
50+
options.setResolve(true);
51+
SwaggerParseResult parseResult = openApiParser.readLocation("issue-2037/openapi.yaml", null, options);
52+
OpenAPI openAPI = parseResult.getOpenAPI();
53+
54+
Assert.assertTrue(openAPI.getPaths().get("/get").get$ref() == null);
55+
Assert.assertEquals(openAPI.getPaths().get("/get").getGet().getResponses().get("200").getContent().get("application/json").getSchema().get$ref(), "#/components/schemas/ResponsesRef");
56+
}
57+
4658

4759
@Test
4860
public void testFailedToResolveExternalReferences() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
openapi: 3.0.3
2+
info:
3+
title: title
4+
version: LATEST
5+
6+
paths:
7+
/get:
8+
$ref: 'paths/get.yaml#/endpoint'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
endpoint:
2+
get:
3+
operationId: get
4+
requestBody:
5+
content:
6+
application/json:
7+
schema:
8+
$ref: '#/RequestBodyRef'
9+
responses:
10+
'200':
11+
content:
12+
application/json:
13+
schema:
14+
$ref: '#/ResponsesRef'
15+
16+
RequestBodyRef:
17+
type: string
18+
19+
ResponsesRef:
20+
type: string

0 commit comments

Comments
 (0)