Add Jackson date test
This commit is contained in:
parent
eedcbeb186
commit
713552cfce
|
@ -45,6 +45,12 @@
|
||||||
<version>${jackson.version}</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>joda-time</groupId>
|
||||||
|
<artifactId>joda-time</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.code.gson</groupId>
|
<groupId>com.google.code.gson</groupId>
|
||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonParser;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
|
import com.fasterxml.jackson.databind.JsonDeserializer;
|
||||||
|
|
||||||
|
public class CustomDateDeserializer extends JsonDeserializer<Date> {
|
||||||
|
|
||||||
|
private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Date deserialize(final JsonParser jsonparser, final DeserializationContext context) throws IOException, JsonProcessingException {
|
||||||
|
final String date = jsonparser.getText();
|
||||||
|
try {
|
||||||
|
return formatter.parse(date);
|
||||||
|
} catch (final ParseException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
|
||||||
|
public class CustomDateSerializer extends JsonSerializer<Date> {
|
||||||
|
|
||||||
|
private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(final Date value, final JsonGenerator gen, final SerializerProvider arg2) throws IOException, JsonProcessingException {
|
||||||
|
gen.writeString(formatter.format(value));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.joda.time.DateTime;
|
||||||
|
import org.joda.time.format.DateTimeFormat;
|
||||||
|
import org.joda.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
|
||||||
|
public class CustomDateTimeSerializer extends JsonSerializer<DateTime> {
|
||||||
|
|
||||||
|
private static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(final DateTime value, final JsonGenerator gen, final SerializerProvider arg2) throws IOException, JsonProcessingException {
|
||||||
|
gen.writeString(formatter.print(value));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
|
||||||
|
public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
|
||||||
|
|
||||||
|
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(final LocalDateTime value, final JsonGenerator gen, final SerializerProvider arg2) throws IOException, JsonProcessingException {
|
||||||
|
gen.writeString(formatter.format(value));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class Event {
|
||||||
|
public String name;
|
||||||
|
public Date eventDate;
|
||||||
|
|
||||||
|
public Event() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Event(final String name, final Date eventDate) {
|
||||||
|
this.name = name;
|
||||||
|
this.eventDate = eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getEventDate() {
|
||||||
|
return eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
public class EventWithFormat {
|
||||||
|
public String name;
|
||||||
|
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
|
||||||
|
public Date eventDate;
|
||||||
|
|
||||||
|
public EventWithFormat() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventWithFormat(final String name, final Date eventDate) {
|
||||||
|
this.name = name;
|
||||||
|
this.eventDate = eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getEventDate() {
|
||||||
|
return eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import org.joda.time.DateTime;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
|
||||||
|
public class EventWithJodaTime {
|
||||||
|
public String name;
|
||||||
|
|
||||||
|
@JsonSerialize(using = CustomDateTimeSerializer.class)
|
||||||
|
public DateTime eventDate;
|
||||||
|
|
||||||
|
public EventWithJodaTime() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventWithJodaTime(final String name, final DateTime eventDate) {
|
||||||
|
this.name = name;
|
||||||
|
this.eventDate = eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime getEventDate() {
|
||||||
|
return eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
|
||||||
|
public class EventWithLocalDateTime {
|
||||||
|
public String name;
|
||||||
|
|
||||||
|
@JsonSerialize(using = CustomLocalDateTimeSerializer.class)
|
||||||
|
public LocalDateTime eventDate;
|
||||||
|
|
||||||
|
public EventWithLocalDateTime() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventWithLocalDateTime(final String name, final LocalDateTime eventDate) {
|
||||||
|
this.name = name;
|
||||||
|
this.eventDate = eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDateTime getEventDate() {
|
||||||
|
return eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package org.baeldung.jackson.date;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
|
||||||
|
public class EventWithSerializer {
|
||||||
|
public String name;
|
||||||
|
|
||||||
|
@JsonDeserialize(using = CustomDateDeserializer.class)
|
||||||
|
@JsonSerialize(using = CustomDateSerializer.class)
|
||||||
|
public Date eventDate;
|
||||||
|
|
||||||
|
public EventWithSerializer() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventWithSerializer(final String name, final Date eventDate) {
|
||||||
|
this.name = name;
|
||||||
|
this.eventDate = eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getEventDate() {
|
||||||
|
return eventDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
package org.baeldung.jackson.test;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
import org.baeldung.jackson.date.Event;
|
||||||
|
import org.baeldung.jackson.date.EventWithFormat;
|
||||||
|
import org.baeldung.jackson.date.EventWithJodaTime;
|
||||||
|
import org.baeldung.jackson.date.EventWithLocalDateTime;
|
||||||
|
import org.baeldung.jackson.date.EventWithSerializer;
|
||||||
|
import org.joda.time.DateTime;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||||
|
|
||||||
|
public class JacksonDateTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenSerializeDateWithJackson_thenSerializedToNumber() throws JsonProcessingException, ParseException {
|
||||||
|
final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm");
|
||||||
|
df.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
|
|
||||||
|
final String toParse = "01-01-1970 01:00";
|
||||||
|
final Date date = df.parse(toParse);
|
||||||
|
final Event event = new Event("party", date);
|
||||||
|
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
final String result = mapper.writeValueAsString(event);
|
||||||
|
assertThat(result, containsString("3600000"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenSerializeDateToISO8601_thenSerializedToText() throws JsonProcessingException, ParseException {
|
||||||
|
final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm");
|
||||||
|
df.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
|
|
||||||
|
final String toParse = "01-01-1970 02:30";
|
||||||
|
final Date date = df.parse(toParse);
|
||||||
|
final Event event = new Event("party", date);
|
||||||
|
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
||||||
|
|
||||||
|
final String result = mapper.writeValueAsString(event);
|
||||||
|
assertThat(result, containsString("1970-01-01T02:30:00.000+0000"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenSetObjectMapperDateFormat_thenCorrect() throws JsonProcessingException, ParseException {
|
||||||
|
final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm");
|
||||||
|
|
||||||
|
final String toParse = "20-12-2014 02:30";
|
||||||
|
final Date date = df.parse(toParse);
|
||||||
|
final Event event = new Event("party", date);
|
||||||
|
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
mapper.setDateFormat(df);
|
||||||
|
|
||||||
|
final String result = mapper.writeValueAsString(event);
|
||||||
|
assertThat(result, containsString(toParse));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUseJsonFormatAnnotationToFormatDate_thenCorrect() throws JsonProcessingException, ParseException {
|
||||||
|
final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
|
||||||
|
df.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
|
|
||||||
|
final String toParse = "20-12-2014 02:30:00";
|
||||||
|
final Date date = df.parse(toParse);
|
||||||
|
final EventWithFormat event = new EventWithFormat("party", date);
|
||||||
|
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
final String result = mapper.writeValueAsString(event);
|
||||||
|
assertThat(result, containsString(toParse));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUseCustomDateSerializer_thenCorrect() throws JsonProcessingException, ParseException {
|
||||||
|
final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
|
||||||
|
|
||||||
|
final String toParse = "20-12-2014 02:30:00";
|
||||||
|
final Date date = df.parse(toParse);
|
||||||
|
final EventWithSerializer event = new EventWithSerializer("party", date);
|
||||||
|
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
final String result = mapper.writeValueAsString(event);
|
||||||
|
assertThat(result, containsString(toParse));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenSerializeJodaTimeWithJackson_thenCorrect() throws JsonProcessingException {
|
||||||
|
final DateTime date = new DateTime(2014, 12, 20, 2, 30);
|
||||||
|
final EventWithJodaTime event = new EventWithJodaTime("party", date);
|
||||||
|
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
final String result = mapper.writeValueAsString(event);
|
||||||
|
assertThat(result, containsString("2014-12-20 02:30"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenSerializeJava8DateWithCustomSerializer_thenCorrect() throws JsonProcessingException {
|
||||||
|
final LocalDateTime date = LocalDateTime.of(2014, 12, 20, 2, 30);
|
||||||
|
final EventWithLocalDateTime event = new EventWithLocalDateTime("party", date);
|
||||||
|
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
final String result = mapper.writeValueAsString(event);
|
||||||
|
assertThat(result, containsString("2014-12-20 02:30"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenDeserializeDateWithJackson_thenCorrect() throws JsonProcessingException, IOException {
|
||||||
|
final String json = "{\"name\":\"party\",\"eventDate\":\"20-12-2014 02:30:00\"}";
|
||||||
|
|
||||||
|
final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
mapper.setDateFormat(df);
|
||||||
|
|
||||||
|
final Event event = mapper.reader(Event.class).readValue(json);
|
||||||
|
assertEquals("20-12-2014 02:30:00", df.format(event.eventDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenDeserializeDateUsingCustomDeserializer_thenCorrect() throws JsonProcessingException, IOException {
|
||||||
|
final String json = "{\"name\":\"party\",\"eventDate\":\"20-12-2014 02:30:00\"}";
|
||||||
|
|
||||||
|
final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
|
||||||
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
||||||
|
final EventWithSerializer event = mapper.reader(EventWithSerializer.class).readValue(json);
|
||||||
|
assertEquals("20-12-2014 02:30:00", df.format(event.eventDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,10 +1,12 @@
|
||||||
package org.baeldung.config;
|
package org.baeldung.config;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
|
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
|
||||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
||||||
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
|
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
|
||||||
import org.springframework.oxm.xstream.XStreamMarshaller;
|
import org.springframework.oxm.xstream.XStreamMarshaller;
|
||||||
|
@ -25,7 +27,12 @@ public class WebConfig extends WebMvcConfigurerAdapter {
|
||||||
@Override
|
@Override
|
||||||
public void configureMessageConverters(final List<HttpMessageConverter<?>> messageConverters) {
|
public void configureMessageConverters(final List<HttpMessageConverter<?>> messageConverters) {
|
||||||
messageConverters.add(createXmlHttpMessageConverter());
|
messageConverters.add(createXmlHttpMessageConverter());
|
||||||
messageConverters.add(new MappingJackson2HttpMessageConverter());
|
// messageConverters.add(new MappingJackson2HttpMessageConverter());
|
||||||
|
|
||||||
|
final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
|
||||||
|
builder.indentOutput(true).dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm"));
|
||||||
|
messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
|
||||||
|
// messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
|
||||||
|
|
||||||
super.configureMessageConverters(messageConverters);
|
super.configureMessageConverters(messageConverters);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package org.baeldung.web.controller;
|
package org.baeldung.web.controller;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import org.baeldung.web.dto.Item;
|
import org.baeldung.web.dto.Item;
|
||||||
import org.baeldung.web.dto.ItemManager;
|
import org.baeldung.web.dto.ItemManager;
|
||||||
import org.baeldung.web.dto.Views;
|
import org.baeldung.web.dto.Views;
|
||||||
|
@ -23,4 +25,9 @@ public class ItemController {
|
||||||
public Item getItemInternal(@PathVariable final int id) {
|
public Item getItemInternal(@PathVariable final int id) {
|
||||||
return ItemManager.getById(id);
|
return ItemManager.getById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/date")
|
||||||
|
public Date getCurrentDate() {
|
||||||
|
return new Date();
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue