diff --git a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java index 019aeaf6fd..4d56c32899 100644 --- a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java +++ b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java @@ -655,10 +655,14 @@ public Operation convert(io.swagger.models.Operation v2Operation) { private Map convert(Map vendorExtensions) { if (vendorExtensions != null && vendorExtensions.size() > 0) { - vendorExtensions.entrySet().removeIf(extension -> ( - extension.getKey().equals("x-example")) || - extension.getKey().equals("x-examples") || - extension.getKey().equals("x-nullable")); + Map result = new LinkedHashMap<>(); + for (Map.Entry entry : vendorExtensions.entrySet()) { + String key = entry.getKey(); + if (!key.equals("x-example") && !key.equals("x-examples") && !key.equals("x-nullable")) { + result.put(key, entry.getValue()); + } + } + return result; } return vendorExtensions; diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java index ada569d28d..f8b3f3f480 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java @@ -686,6 +686,32 @@ public void testIssue1552() throws Exception { assertNotNull(schema.getProperties().get("foo")); } + @Test(description = "Issue 2269: preserve x-nullable in shared responses for swagger 2.0 specs") + public void testSwagger2SharedResponseNullable() { + ParseOptions options = new ParseOptions(); + options.setResolve(true); + options.setResolveFully(true); + + SwaggerParseResult result = new OpenAPIParser().readLocation("issue2269.yaml", null, options); + + assertNotNull(result); + assertNotNull(result.getOpenAPI()); + OpenAPI openAPI = result.getOpenAPI(); + + Schema endpoint1Field = (Schema) openAPI.getPaths().get("/endpoint1").getGet() + .getResponses().get("200").getContent().values().iterator().next() + .getSchema().getProperties().get("optional_field"); + assertNotNull(endpoint1Field, "Endpoint 1 should have optional_field"); + assertEquals(endpoint1Field.getNullable(), Boolean.TRUE, "Endpoint 1 optional_field should be nullable"); + + Schema endpoint2Field = (Schema) openAPI.getPaths().get("/endpoint2").getGet() + .getResponses().get("200").getContent().values().iterator().next() + .getSchema().getProperties().get("optional_field"); + assertNotNull(endpoint2Field, "Endpoint 2 should have optional_field"); + assertEquals(endpoint2Field.getNullable(), Boolean.TRUE, "Endpoint 2 optional_field should be nullable"); + + } + @org.testng.annotations.Test(description = "convert response schema") public void testIssue1552AdditionalProps() throws Exception { ParseOptions options = new ParseOptions(); diff --git a/modules/swagger-parser/src/test/resources/issue2269.yaml b/modules/swagger-parser/src/test/resources/issue2269.yaml new file mode 100644 index 0000000000..19116c0f10 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue2269.yaml @@ -0,0 +1,38 @@ +swagger: '2.0' +info: + version: 1.0.0 + title: Swagger 2.0 Shared Response Test + description: Test case for verifying x-nullable is preserved when multiple endpoints share the same response definition + +responses: + SharedResponse: + description: A shared response with nullable field + schema: + type: object + properties: + data: + type: string + description: Required field + optional_field: + type: integer + description: Optional nullable field + x-nullable: true + required: + - data + +paths: + /endpoint1: + get: + operationId: endpoint1 + summary: First endpoint using shared response + responses: + '200': + $ref: '#/responses/SharedResponse' + + /endpoint2: + get: + operationId: endpoint2 + summary: Second endpoint using shared response + responses: + '200': + $ref: '#/responses/SharedResponse'