package com.fasterxml.jackson.databind.ser.jdk;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
// Tests for `java.sql.Date`, `java.sql.Time` and `java.sql.Timestamp`
public class SqlDateSerializationTest extends BaseMapTest
{
static class SqlDateAsDefaultBean {
public java.sql.Date date;
public SqlDateAsDefaultBean(long l) { date = new java.sql.Date(l); }
}
static class SqlDateAsNumberBean {
@JsonFormat(shape=JsonFormat.Shape.NUMBER)
public java.sql.Date date;
public SqlDateAsNumberBean(long l) { date = new java.sql.Date(l); }
}
// for [databind#1407]
static class Person {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd")
public java.sql.Date dateOfBirth;
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
@SuppressWarnings("deprecation")
public void testSqlDate() throws IOException
{
// use date 1999-04-01 (note: months are 0-based, use constant)
final java.sql.Date date99 = new java.sql.Date(99, Calendar.APRIL, 1);
final java.sql.Date date0 = new java.sql.Date(0);
// 11-Oct-2016, tatu: As per [databind#219] we really should use global
// defaults in 2.9, even if this changes behavior.
assertEquals(String.valueOf(date99.getTime()),
MAPPER.writeValueAsString(date99));
assertEquals(aposToQuotes("{'date':0}"),
MAPPER.writeValueAsString(new SqlDateAsDefaultBean(0L)));
// but may explicitly force timestamp too
assertEquals(aposToQuotes("{'date':0}"),
MAPPER.writeValueAsString(new SqlDateAsNumberBean(0L)));
// And also should be able to use String output as need be:
ObjectWriter w = MAPPER.writer().without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
assertEquals(quote("1999-04-01"), w.writeValueAsString(date99));
assertEquals(quote(date0.toString()), w.writeValueAsString(date0));
assertEquals(aposToQuotes("{'date':'"+date0.toString()+"'}"),
w.writeValueAsString(new SqlDateAsDefaultBean(0L)));
}
public void testSqlTime() throws IOException
{
java.sql.Time time = new java.sql.Time(0L);
// not 100% sure what we should expect wrt timezone, but what serializes
// does use is quite simple:
assertEquals(quote(time.toString()), MAPPER.writeValueAsString(time));
}
public void testSqlTimestamp() throws IOException
{
java.sql.Timestamp input = new java.sql.Timestamp(0L);
// just should produce same output as standard `java.util.Date`:
Date altTnput = new Date(0L);
assertEquals(MAPPER.writeValueAsString(altTnput),
MAPPER.writeValueAsString(input));
}
public void testPatternWithSqlDate() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
// `java.sql.Date` applies system default zone (and not UTC)
mapper.setTimeZone(TimeZone.getDefault());
Person i = new Person();
i.dateOfBirth = java.sql.Date.valueOf("1980-04-14");
assertEquals(aposToQuotes("{'dateOfBirth':'1980.04.14'}"),
mapper.writeValueAsString(i));
}
}