DATACOUCH-147 - Allow to convert Date to ISO-8601 compliant strings

instead of long

Using the system property
org.springframework.data.couchbase.useISOStringConverterForDate the
conversion can be enabled so this doesn't break backward compatibility

Original pull request: #143.
This commit is contained in:
Subhashni Balakrishnan
2017-04-10 15:06:56 -07:00
parent e273152013
commit fc88b82328
3 changed files with 53 additions and 23 deletions

View File

@@ -271,6 +271,7 @@ A populated object can look like:
----
====
Optionally, Date can be converted to and from ISO-8601 compliant strings by setting system property `org.springframework.data.couchbase.useISOStringConverterForDate` to true.
If you want to override a converter or implement your own one, this is also possible. The library implements the general Spring Converter pattern. You can plug in custom converters on bean creation time in your configuration. Here's how you can configure it (in your overridden `AbstractCouchbaseConfiguration`):
.Custom Converters

View File

@@ -81,7 +81,7 @@ public final class CouchbaseJsr310Converters {
@Override
public LocalDateTime convert(Number source) {
return source == null ? null : ofInstant(
DateConverters.NumberToDateConverter.INSTANCE.convert(source)
DateConverters.SerializedObjectToDateConverter.INSTANCE.convert(source)
.toInstant(), systemDefault());
}
}
@@ -107,7 +107,7 @@ public final class CouchbaseJsr310Converters {
@Override
public LocalDate convert(Number source) {
return source == null ? null : ofInstant(ofEpochMilli(
DateConverters.NumberToDateConverter.INSTANCE.convert(source).getTime()),
DateConverters.SerializedObjectToDateConverter.INSTANCE.convert(source).getTime()),
systemDefault()).toLocalDate();
}
}
@@ -132,7 +132,7 @@ public final class CouchbaseJsr310Converters {
@Override
public LocalTime convert(Number source) {
return source == null ? null : ofInstant(ofEpochMilli(
DateConverters.NumberToDateConverter.INSTANCE.convert(source)
DateConverters.SerializedObjectToDateConverter.INSTANCE.convert(source)
.getTime()), systemDefault()).toLocalTime();
}
}
@@ -156,7 +156,7 @@ public final class CouchbaseJsr310Converters {
@Override
public Instant convert(Number source) {
return source == null ? null : DateConverters.NumberToDateConverter.INSTANCE.convert(source).toInstant();
return source == null ? null : DateConverters.SerializedObjectToDateConverter.INSTANCE.convert(source).toInstant();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2015 the original author or authors
* Copyright 2012-2017 the original author or authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,6 +16,9 @@
package org.springframework.data.couchbase.core.convert;
import static java.time.ZoneId.systemDefault;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
@@ -36,6 +39,7 @@ import org.springframework.util.ClassUtils;
* Out of the box conversions for java dates and calendars.
*
* @author Michael Nitschinger
* @author Subhashni Balakrishnan
*/
public final class DateConverters {
@@ -52,9 +56,18 @@ public final class DateConverters {
public static Collection<Converter<?, ?>> getConvertersToRegister() {
List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
converters.add(DateToLongConverter.INSTANCE);
boolean useISOStringConverterForDate = Boolean.parseBoolean(
System.getProperty("org.springframework.data.couchbase.useISOStringConverterForDate", "false"));
if (useISOStringConverterForDate) {
converters.add(DateToStringConverter.INSTANCE);
} else {
converters.add(DateToLongConverter.INSTANCE);
}
converters.add(SerializedObjectToDateConverter.INSTANCE);
converters.add(CalendarToLongConverter.INSTANCE);
converters.add(NumberToDateConverter.INSTANCE);
converters.add(NumberToCalendarConverter.INSTANCE);
if (JODA_TIME_IS_PRESENT) {
@@ -71,6 +84,38 @@ public final class DateConverters {
return converters;
}
@WritingConverter
public enum DateToStringConverter implements Converter<Date, String> {
INSTANCE;
@Override
public String convert(Date source) {
return source == null ? null : source.toInstant().toString();
}
}
@ReadingConverter
public enum SerializedObjectToDateConverter implements Converter<Object, Date> {
INSTANCE;
@Override
public Date convert(Object source) {
if (source == null) {
return null;
}
if (source instanceof Number) {
Date date = new Date();
date.setTime(((Number) source).longValue());
return date;
} else if (source instanceof String) {
return Date.from(Instant.parse((String) source).atZone(systemDefault()).toInstant());
} else {
//Unsupported serialized object
return null;
}
}
}
@WritingConverter
public enum DateToLongConverter implements Converter<Date, Long> {
INSTANCE;
@@ -91,22 +136,6 @@ public final class DateConverters {
}
}
@ReadingConverter
public enum NumberToDateConverter implements Converter<Number, Date> {
INSTANCE;
@Override
public Date convert(Number source) {
if (source == null) {
return null;
}
Date date = new Date();
date.setTime(source.longValue());
return date;
}
}
@ReadingConverter
public enum NumberToCalendarConverter implements Converter<Number, Calendar> {
INSTANCE;