diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java index c6d6d3cae1..35edf978b1 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java @@ -1153,27 +1153,32 @@ public ExternalDocumentation getExternalDocs(ObjectNode node, String location, P public String getString(String key, ObjectNode node, boolean required, String location, ParseResult result, Set uniqueValues, boolean noInvalidError) { - String value = null; - JsonNode v = node.get(key); - if (node == null || v == null) { - if (required) { - result.missing(location, key); - result.invalid(); - } - } else if (!v.isValueNode()) { - if (!noInvalidError) { - result.invalidType(location, key, "string", node); - } - } else if (!v.isNull()) { - value = v.asText(); - if (uniqueValues != null && !uniqueValues.add(value)) { - result.unique(location, "operationId"); - result.invalid(); - } - } - return value; + return getString(key, node, required, location, result, uniqueValues, noInvalidError, false); } + public String getString(String key, ObjectNode node, boolean required, String location, ParseResult + result, Set uniqueValues, boolean noInvalidError, boolean missingForNullNode) { + String value = null; + JsonNode v = node.get(key); + if (node == null || v == null || (v.isNull() && missingForNullNode)) { + if (required) { + result.missing(location, key); + result.invalid(); + } + } else if (!v.isValueNode()) { + if (!noInvalidError) { + result.invalidType(location, key, "string", node); + } + } else if (!v.isNull()) { + value = v.asText(); + if (uniqueValues != null && !uniqueValues.add(value)) { + result.unique(location, "operationId"); + result.invalid(); + } + } + return value; + } + public String getString(String key, ObjectNode node, boolean required, String location, ParseResult result, Set uniqueValues) { return getString(key, node, required, location, result, uniqueValues, false); @@ -1289,7 +1294,7 @@ public Info getInfo(ObjectNode node, String location, ParseResult result) { info.setLicense(license); } - value = getString("version", node, true, location, result); + value = getString("version", node, true, location, result, null, false, true); if ((result.isAllowEmptyStrings() && value != null) || (!result.isAllowEmptyStrings() && !StringUtils.isBlank(value))) { info.setVersion(value); } diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index 1308c6c024..25a32f1797 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -3421,4 +3421,12 @@ public void testStyleAndExplodeExplicit(){ assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithout").getStyle().toString(), "form"); assertNull(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithout").getExplode()); } + + @Test(description = "null version should cause a message") + public void testVersion(){ + ParseOptions options = new ParseOptions(); + OpenAPIV3Parser openApiParser = new OpenAPIV3Parser(); + SwaggerParseResult parseResult = openApiParser.readLocation("version-missing.yaml", null, options); + assertEquals(parseResult.getMessages().get(0), "attribute info.version is missing"); + } } \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/version-missing.yaml b/modules/swagger-parser-v3/src/test/resources/version-missing.yaml new file mode 100644 index 0000000000..e57562f89c --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/version-missing.yaml @@ -0,0 +1,5 @@ +openapi: 3.0.3 +info: + title: Example API with Style and Explode + version: +paths: {} \ No newline at end of file