diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/OtherConverters.java b/src/main/java/org/springframework/data/couchbase/core/convert/OtherConverters.java index e89786bf6..71f2ebaa6 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/OtherConverters.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/OtherConverters.java @@ -22,6 +22,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.StandardCharsets; +import java.time.YearMonth; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -83,6 +84,8 @@ private OtherConverters() {} converters.add(MapToJsonObject.INSTANCE); converters.add(JsonArrayToCouchbaseList.INSTANCE); converters.add(CouchbaseListToJsonArray.INSTANCE); + converters.add(YearMonthToStringConverter.INSTANCE); + converters.add(StringToYearMonthConverter.INSTANCE); // EnumToObject, IntegerToEnumConverterFactory and StringToEnumConverterFactory are // registered in // {@link org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration#customConversions( @@ -329,4 +332,26 @@ public JsonArray convert(CouchbaseList source) { } } + @WritingConverter + public enum YearMonthToStringConverter implements Converter { + + INSTANCE; + + @Override + public String convert(YearMonth source) { + return source.toString(); + } + } + + @ReadingConverter + public enum StringToYearMonthConverter implements Converter { + + INSTANCE; + + @Override + public YearMonth convert(String source) { + return YearMonth.parse(source); + } + } + } diff --git a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java index 548114923..e8d80e7c8 100644 --- a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java @@ -25,6 +25,7 @@ import java.math.BigInteger; import java.text.ChoiceFormat; import java.time.LocalDateTime; +import java.time.YearMonth; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; @@ -288,6 +289,28 @@ void readsID() { assertThat(user.getId()).isEqualTo("001"); } + @Test + void writesYearMonth() { + CouchbaseDocument converted = new CouchbaseDocument(); + YearMonthEntity entity = new YearMonthEntity(YearMonth.parse("2023-04")); + + converter.write(entity, converted); + Map result = converted.export(); + assertThat(result.get("_class")).isEqualTo(entity.getClass().getName()); + assertThat(result.get("attr0")).isEqualTo(entity.attr0.toString()); + assertThat(converted.getId()).isEqualTo(BaseEntity.ID); + } + + @Test + void readsYearMonth() { + CouchbaseDocument source = new CouchbaseDocument(); + source.put("_class", YearMonthEntity.class.getName()); + source.put("attr0", "2023-04"); + + YearMonthEntity converted = converter.read(YearMonthEntity.class, source); + assertThat(converted.attr0).isEqualTo(YearMonth.parse((String) source.get("attr0"))); + } + @Test void writesUninitializedValues() { CouchbaseDocument converted = new CouchbaseDocument(); @@ -786,6 +809,15 @@ public BigIntegerEntity(BigInteger attr0) { } } + static class YearMonthEntity extends BaseEntity { + private YearMonth attr0; + + public YearMonthEntity(YearMonth attr0) { + this.attr0 = attr0; + } + } + + static class BigDecimalEntity extends BaseEntity { private BigDecimal attr0;