Skip to content

Commit b657a9b

Browse files
fix: treat example values starting with numbers as strings
1 parent adf4597 commit b657a9b

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -765,15 +765,7 @@ public static Optional<Schema> getSchemaFromAnnotation(
765765
schemaObject.setDefault(schema.defaultValue());
766766
}
767767
if (StringUtils.isNotBlank(schema.example())) {
768-
try {
769-
if (openapi31) {
770-
schemaObject.setExample(Json31.mapper().readTree(schema.example()));
771-
} else {
772-
schemaObject.setExample(Json.mapper().readTree(schema.example()));
773-
}
774-
} catch (IOException e) {
775-
schemaObject.setExample(schema.example());
776-
}
768+
setExampleSchema(schema, openapi31, schemaObject);
777769
}
778770
if (StringUtils.isNotBlank(schema.format())) {
779771
schemaObject.setFormat(schema.format());
@@ -892,6 +884,25 @@ public static Optional<Schema> getSchemaFromAnnotation(
892884
return Optional.of(schemaObject);
893885
}
894886

887+
private static void setExampleSchema(io.swagger.v3.oas.annotations.media.Schema schema, boolean openapi31, Schema schemaObject) {
888+
String exampleValue = schema.example().trim();
889+
890+
// Prevent numeric-starting example strings (e.g. "5 lacs per annum") from being parsed as numbers
891+
if (exampleValue.matches("^\\d.*") && !exampleValue.startsWith("\"")) {
892+
schemaObject.setExample(exampleValue);
893+
} else {
894+
try {
895+
if (openapi31) {
896+
schemaObject.setExample(Json31.mapper().readTree(exampleValue));
897+
} else {
898+
schemaObject.setExample(Json.mapper().readTree(exampleValue));
899+
}
900+
} catch (IOException e) {
901+
schemaObject.setExample(exampleValue);
902+
}
903+
}
904+
}
905+
895906
public static Schema resolveSchemaFromType(Class<?> schemaImplementation, Components components, JsonView jsonViewAnnotation) {
896907
return resolveSchemaFromType(schemaImplementation, components, jsonViewAnnotation, false);
897908
}

modules/swagger-core/src/test/java/io/swagger/v3/core/util/AnnotationsUtilsTest.java

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ private Object[][] expectedSchemaFromTypes() {
5454
public void resolveSchemaFromType(Class<?> aClass, Map<String, Object> expected) {
5555
Schema schema = AnnotationsUtils.resolveSchemaFromType(aClass, new Components(), null);
5656

57-
assertEquals(schema.getType(), expected.get("type"));
58-
assertEquals(schema.getFormat(), expected.get("format"));
59-
assertEquals(schema.get$ref(), expected.get("$ref"));
57+
assertEquals(schema.getType(), expected.get("type"));
58+
assertEquals(schema.getFormat(), expected.get("format"));
59+
assertEquals(schema.get$ref(), expected.get("$ref"));
6060
}
6161

6262
@DataProvider
@@ -75,10 +75,10 @@ public void getSchema(String methodName, Map<String, Object> expected) throws No
7575
Content annotationContent = method.getAnnotation(ApiResponse.class).content()[0];
7676
Optional<? extends Schema> schema = AnnotationsUtils.getSchema(annotationContent, new Components(), null, false);
7777

78-
assertTrue(schema.isPresent());
79-
assertEquals(schema.get().getType(), expected.get("type"));
80-
assertEquals(schema.get().getFormat(), expected.get("format"));
81-
assertEquals(schema.get().get$ref(), expected.get("$ref"));
78+
assertTrue(schema.isPresent());
79+
assertEquals(schema.get().getType(), expected.get("type"));
80+
assertEquals(schema.get().getFormat(), expected.get("format"));
81+
assertEquals(schema.get().get$ref(), expected.get("$ref"));
8282
}
8383

8484
@ApiResponse(content = @Content(schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = Byte.class)))
@@ -99,4 +99,31 @@ private void dummyType() {
9999

100100
class DummyClass implements Serializable {}
101101

102+
static class ExampleHolder {
103+
@io.swagger.v3.oas.annotations.media.Schema(type = "string", example = "5 lacs per annum")
104+
String value;
105+
}
106+
107+
@Test
108+
public void testExampleStartingWithNumberShouldBeString() throws Exception {
109+
io.swagger.v3.oas.annotations.media.Schema schemaAnnotation =
110+
ExampleHolder.class
111+
.getDeclaredField("value")
112+
.getAnnotation(io.swagger.v3.oas.annotations.media.Schema.class);
113+
114+
Optional<Schema> schema =
115+
AnnotationsUtils.getSchemaFromAnnotation(
116+
schemaAnnotation,
117+
null,
118+
null,
119+
false,
120+
null,
121+
Schema.SchemaResolution.DEFAULT,
122+
null
123+
);
124+
125+
assertTrue(schema.isPresent());
126+
assertEquals(schema.get().getExample(), "5 lacs per annum");
127+
}
128+
102129
}

0 commit comments

Comments
 (0)