Skip to content

Commit 37034fc

Browse files
committed
Merge pull request #1155 from fenrhil/patch-1
Fix for #1154
2 parents b37f82a + 16cb352 commit 37034fc

File tree

2 files changed

+83
-5
lines changed

2 files changed

+83
-5
lines changed

src/main/java/com/fasterxml/jackson/databind/ser/std/DateTimeSerializerBase.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,15 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
5959
return withFormat(Boolean.TRUE, null);
6060
}
6161

62-
if (format.getShape() == JsonFormat.Shape.STRING) {
62+
if (format.getShape() == JsonFormat.Shape.STRING || format.hasPattern()
63+
|| format.hasLocale() || format.hasTimeZone()) {
6364
TimeZone tz = format.getTimeZone();
6465
final String pattern = format.hasPattern()
65-
? format.getPattern()
66-
: StdDateFormat.DATE_FORMAT_STR_ISO8601;
66+
? format.getPattern()
67+
: StdDateFormat.DATE_FORMAT_STR_ISO8601;
6768
final Locale loc = format.hasLocale()
68-
? format.getLocale()
69-
: serializers.getLocale();
69+
? format.getLocale()
70+
: serializers.getLocale();
7071
SimpleDateFormat df = new SimpleDateFormat(pattern, loc);
7172
if (tz == null) {
7273
tz = serializers.getTimeZone();

src/test/java/com/fasterxml/jackson/databind/ser/DateSerializationTest.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,35 @@ public CalendarAsStringBean(long l) {
6464
}
6565
}
6666

67+
static class DateAsDefaultBean {
68+
public Date date;
69+
public DateAsDefaultBean(long l) { date = new java.util.Date(l); }
70+
}
71+
72+
static class DateAsDefaultBeanWithEmptyJsonFormat {
73+
@JsonFormat
74+
public Date date;
75+
public DateAsDefaultBeanWithEmptyJsonFormat(long l) { date = new java.util.Date(l); }
76+
}
77+
78+
static class DateAsDefaultBeanWithPattern {
79+
@JsonFormat(pattern="yyyy-MM-dd")
80+
public Date date;
81+
public DateAsDefaultBeanWithPattern(long l) { date = new java.util.Date(l); }
82+
}
83+
84+
static class DateAsDefaultBeanWithLocale {
85+
@JsonFormat(locale = "fr")
86+
public Date date;
87+
public DateAsDefaultBeanWithLocale(long l) { date = new java.util.Date(l); }
88+
}
89+
90+
static class DateAsDefaultBeanWithTimezone {
91+
@JsonFormat(timezone="CET")
92+
public Date date;
93+
public DateAsDefaultBeanWithTimezone(long l) { date = new java.util.Date(l); }
94+
}
95+
6796
/*
6897
/**********************************************************
6998
/* Test methods
@@ -229,5 +258,53 @@ public void testWithTimeZoneOverride() throws Exception
229258
json = w.writeValueAsString(new Date(0));
230259
assertEquals(quote("1969-12-31/19:00 EST"), json);
231260
}
261+
262+
/**
263+
* Test to ensure that the default shape is correctly inferred as string or numeric,
264+
* when this shape is not explicitly set with a <code>@JsonFormat</code> annotation
265+
*/
266+
public void testDateDefaultShape() throws Exception
267+
{
268+
ObjectMapper mapper = new ObjectMapper();
269+
// No @JsonFormat => default to user config
270+
mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
271+
String json = mapper.writeValueAsString(new DateAsDefaultBean(0L));
272+
assertEquals(aposToQuotes("{'date':0}"), json);
273+
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
274+
json = mapper.writeValueAsString(new DateAsDefaultBean(0L));
275+
assertEquals(aposToQuotes("{'date':'1970-01-01T00:00:00.000+0000'}"), json);
276+
277+
// Empty @JsonFormat => default to user config
278+
mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
279+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithEmptyJsonFormat(0L));
280+
assertEquals(aposToQuotes("{'date':0}"), json);
281+
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
282+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithEmptyJsonFormat(0L));
283+
assertEquals(aposToQuotes("{'date':'1970-01-01T00:00:00.000+0000'}"), json);
284+
285+
// @JsonFormat with Shape.ANY and pattern => STRING shape, regardless of user config
286+
mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
287+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithPattern(0L));
288+
assertEquals(aposToQuotes("{'date':'1970-01-01'}"), json);
289+
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
290+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithPattern(0L));
291+
assertEquals(aposToQuotes("{'date':'1970-01-01'}"), json);
292+
293+
// @JsonFormat with Shape.ANY and locale => STRING shape, regardless of user config
294+
mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
295+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithLocale(0L));
296+
assertEquals(aposToQuotes("{'date':'1970-01-01T00:00:00.000+0000'}"), json);
297+
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
298+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithLocale(0L));
299+
assertEquals(aposToQuotes("{'date':'1970-01-01T00:00:00.000+0000'}"), json);
300+
301+
// @JsonFormat with Shape.ANY and timezone => STRING shape, regardless of user config
302+
mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
303+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithTimezone(0L));
304+
assertEquals(aposToQuotes("{'date':'1970-01-01T01:00:00.000+0100'}"), json);
305+
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
306+
json = mapper.writeValueAsString(new DateAsDefaultBeanWithTimezone(0L));
307+
assertEquals(aposToQuotes("{'date':'1970-01-01T01:00:00.000+0100'}"), json);
308+
}
232309
}
233310

0 commit comments

Comments
 (0)