From 659d5b996a88eb0da3cd591553f294373be04de6 Mon Sep 17 00:00:00 2001 From: "jean-francois.renaud" Date: Thu, 5 Mar 2026 15:45:03 -0500 Subject: [PATCH] fix: Now correctly hangling default int64 values for integer components of type int64 --- .../v3/parser/util/OpenAPIDeserializer.java | 29 +++++++++++++++++-- .../v3/parser/test/OpenAPIV3ParserTest.java | 17 +++++++++-- .../src/test/resources/int64example.yaml | 15 ++++++++-- 3 files changed, 53 insertions(+), 8 deletions(-) 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 35edf978b1..76ca27c140 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 @@ -1903,6 +1903,29 @@ public Integer getInteger(String key, ObjectNode node, boolean required, String return value; } + private Number getInteger32or64(String key, ObjectNode node, boolean required, String location, ParseResult result) { + Number value = null; + JsonNode v = node.get(key); + if (node == null || v == null) { + if (required) { + result.missing(location, key); + result.invalid(); + } + } else if (v.getNodeType().equals(JsonNodeType.NUMBER)) { + if (v.isInt()) { + value = v.intValue(); + } + JsonNode format = node.get("format"); + if (format != null && format.asText().equals("int64") && v.isLong()) { + value = v.longValue(); + } + } else if (!v.isValueNode()) { + result.invalidType(location, key, "integer", node); + } + return value; + } + + public Map getParameters(ObjectNode obj, String location, ParseResult result, boolean underComponents) { if (obj == null) { @@ -2312,7 +2335,7 @@ public Object getAnyType(String nodeKey, ObjectNode node, String location, Parse return getString(nodeKey, node, false, location, result); } if (example.getNodeType().equals(JsonNodeType.NUMBER)) { - Integer integerExample = getInteger(nodeKey, node, false, location, result); + Number integerExample = getInteger32or64(nodeKey, node, false, location, result); if (integerExample != null) { return integerExample; } else { @@ -2973,7 +2996,7 @@ at the moment path passed as string (basePath) from upper components can be both schema.setDefault(object); } } else if (schema.getType().equals("integer")) { - Integer number = getInteger("default", node, false, location, result); + Number number = getInteger32or64("default", node, false, location, result); if (number != null) { schema.setDefault(number); } @@ -3043,7 +3066,7 @@ protected void getCommonSchemaFields(ObjectNode node, String location, ParseResu schema.setMinimum(bigDecimal); } - Integer integer = getInteger("minLength", node, false, location, result); + Integer integer = getInteger("minLength", node, false, location, result); if (integer != null) { schema.setMinLength(integer); } 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 e51663aba5..3f3460bb91 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 @@ -1413,10 +1413,21 @@ public void testOneOfExternalRefConflictName() { } @Test - public void int64ExampleWithoutOverflow() { + public void int64WithoutOverflow() { OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/int64example.yaml"); - IntegerSchema date = ((IntegerSchema) openAPI.getPaths().get("/foo").getGet().getResponses().get("200").getContent().get("application/json").getSchema().getProperties().get("date")); - Assert.assertEquals(date.getExample().toString(), "1516042231144"); + Operation get = openAPI.getPaths().get("/foo").getGet(); + IntegerSchema exampleProperty = ((IntegerSchema) get.getResponses().get("200").getContent().get("application/json").getSchema().getProperties().get("exampleProperty")); + Assert.assertEquals(exampleProperty.getExample().toString(), "1516042231144"); + + Parameter parameter = get.getParameters().get(0); + String maxLong = "9223372036854775807"; + Assert.assertEquals(parameter.getExample().toString(), maxLong); + + IntegerSchema parameterInt64 = ((IntegerSchema) parameter.getSchema()); + Assert.assertEquals(parameterInt64.getExample().toString(), maxLong); + Assert.assertEquals(parameterInt64.getMinimum().toString(), maxLong); + Assert.assertEquals(parameterInt64.getMaximum().toString(), maxLong); + Assert.assertEquals(parameterInt64.getDefault().toString(), maxLong); } @Test diff --git a/modules/swagger-parser-v3/src/test/resources/int64example.yaml b/modules/swagger-parser-v3/src/test/resources/int64example.yaml index 783e140251..8cc979d363 100644 --- a/modules/swagger-parser-v3/src/test/resources/int64example.yaml +++ b/modules/swagger-parser-v3/src/test/resources/int64example.yaml @@ -5,6 +5,17 @@ info: paths: /foo: get: + parameters: + - in: query + name: int64 + example: 9223372036854775807 + schema: + type: integer + format: int64 + default: 9223372036854775807 + example: 9223372036854775807 + minimum: 9223372036854775807 + maximum: 9223372036854775807 responses: '200': description: OK @@ -13,9 +24,9 @@ paths: schema: type: object properties: - date: + exampleProperty: type: integer format: int64 example: 1516042231144 required: - - date + - exampleProperty