Skip to content

Commit 5baf7c6

Browse files
authored
Merge pull request #3271 from swagger-api/swos-126
fix DateSchema and DateTimeSchema example serialization
2 parents ecfae9d + fe857da commit 5baf7c6

File tree

8 files changed

+62
-1
lines changed

8 files changed

+62
-1
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.swagger.v3.core.jackson.mixin;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
5+
public abstract class DateSchemaMixin {
6+
7+
@JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
8+
public abstract Object getExample();
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.swagger.v3.core.jackson.mixin;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
5+
public abstract class DateTimeSchemaMixin {
6+
7+
@JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
8+
public abstract Object getExample();
9+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
1616
import io.swagger.v3.core.jackson.SchemaSerializer;
1717
import io.swagger.v3.core.jackson.mixin.ComponentsMixin;
18+
import io.swagger.v3.core.jackson.mixin.DateSchemaMixin;
19+
import io.swagger.v3.core.jackson.mixin.DateTimeSchemaMixin;
1820
import io.swagger.v3.core.jackson.mixin.ExtensionsMixin;
1921
import io.swagger.v3.core.jackson.mixin.OpenAPIMixin;
2022
import io.swagger.v3.core.jackson.mixin.OperationMixin;
@@ -32,6 +34,8 @@
3234
import io.swagger.v3.oas.models.info.License;
3335
import io.swagger.v3.oas.models.links.Link;
3436
import io.swagger.v3.oas.models.links.LinkParameter;
37+
import io.swagger.v3.oas.models.media.DateSchema;
38+
import io.swagger.v3.oas.models.media.DateTimeSchema;
3539
import io.swagger.v3.oas.models.media.Encoding;
3640
import io.swagger.v3.oas.models.media.EncodingProperty;
3741
import io.swagger.v3.oas.models.media.MediaType;
@@ -126,6 +130,8 @@ public JsonSerializer<?> modifySerializer(
126130
sourceMixins.put(Tag.class, ExtensionsMixin.class);
127131
sourceMixins.put(XML.class, ExtensionsMixin.class);
128132
sourceMixins.put(Schema.class, ExtensionsMixin.class);
133+
sourceMixins.put(DateSchema.class, DateSchemaMixin.class);
134+
sourceMixins.put(DateTimeSchema.class, DateTimeSchemaMixin.class);
129135

130136
mapper.setMixIns(sourceMixins);
131137
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/JsonDeserializationTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,18 @@ public void deserializeLongSchema() throws IOException {
258258
assertEquals(s.getEnum().get(2), 31474836475505055L);
259259
}
260260

261+
@Test
262+
public void deserializeDateExample() throws IOException {
263+
264+
final String jsonString = ResourceUtils.loadClassResource(getClass(), "specFiles/swos-126.yaml");
265+
final OpenAPI swagger = Yaml.mapper().readValue(jsonString, OpenAPI.class);
266+
assertNotNull(swagger);
267+
Map<String, Schema> props = swagger.getComponents().getSchemas().get("MyModel").getProperties();
268+
assertTrue(Yaml.pretty().writeValueAsString(props.get("date")).contains("example: 2019-08-05"));
269+
assertTrue(Yaml.pretty().writeValueAsString(props.get("dateTime")).contains("example: 2019-08-05T12:34:56Z"));
270+
271+
}
272+
261273
@Test(description = "Deserialize ref callback")
262274
public void testDeserializeRefCallback() throws Exception {
263275
String yaml = "openapi: 3.0.1\n" +
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
openapi: 3.0.0
2+
info:
3+
title: ExampleBuilder and date-time examples
4+
version: 0.0.0
5+
paths: {}
6+
7+
components:
8+
schemas:
9+
MyModel:
10+
type: object
11+
properties:
12+
date:
13+
type: string
14+
format: date
15+
example: '2019-08-05'
16+
dateTime:
17+
type: string
18+
format: date-time
19+
example: '2019-08-05T12:34:56Z'

modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/DateSchema.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.swagger.v3.oas.models.media;
1818

19+
import java.text.SimpleDateFormat;
1920
import java.util.Date;
2021
import java.util.Objects;
2122

@@ -50,6 +51,8 @@ protected Date cast(Object value) {
5051
try {
5152
if (value instanceof Date) {
5253
return (Date) value;
54+
} else if (value instanceof String) {
55+
return new SimpleDateFormat("yyyy-MM-dd Z").parse((String)value + " UTC");
5356
}
5457
} catch (Exception e) {
5558
}

modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/DateTimeSchema.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.swagger.v3.oas.models.media;
1818

19+
import java.text.SimpleDateFormat;
1920
import java.util.Date;
2021
import java.util.List;
2122
import java.util.Objects;
@@ -51,6 +52,8 @@ protected Date cast(Object value) {
5152
try {
5253
if (value instanceof Date) {
5354
return (Date) value;
55+
} else if (value instanceof String) {
56+
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").parse((String) value);
5457
}
5558
} catch (Exception e) {
5659
}

modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/Schema.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ public void setExample(Object example) {
691691
}
692692

693693
public Schema example(Object example) {
694-
this.example = cast(example);
694+
setExample(example);
695695
return this;
696696
}
697697

0 commit comments

Comments
 (0)