diff --git a/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java b/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java index e12683015..4d58068a2 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java +++ b/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java @@ -37,14 +37,14 @@ import org.springframework.core.convert.ConverterNotFoundException; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.convert.support.GenericConversionService; import org.springframework.data.convert.CustomConversions; -import org.springframework.data.convert.EntityInstantiator; -import org.springframework.data.convert.EntityInstantiators; import org.springframework.data.mapping.AssociationHandler; import org.springframework.data.mapping.MappingException; import org.springframework.data.mapping.PersistentPropertyAccessor; import org.springframework.data.mapping.PersistentPropertyPath; import org.springframework.data.mapping.PreferredConstructor; import org.springframework.data.mapping.PropertyHandler; +import org.springframework.data.mapping.model.EntityInstantiator; +import org.springframework.data.mapping.model.EntityInstantiators; import org.springframework.data.mapping.model.PersistentEntityParameterValueProvider; import org.springframework.data.mapping.model.PropertyValueProvider; import org.springframework.data.redis.core.PartialUpdate; @@ -567,9 +567,8 @@ public class MappingRedisConverter implements RedisConverter, InitializingBean { Optional> targetType = customConversions.getCustomWriteTarget(value.getClass()); - if (!StringUtils.hasText(path) && targetType.isPresent() - && (targetType.get().equals(byte[].class) || ClassUtils.isAssignable(byte[].class, targetType.get()))) { - sink.getBucket().put(StringUtils.hasText(path) ? path : "_raw", conversionService.convert(value, byte[].class)); + if (!StringUtils.hasText(path) && targetType.isPresent() && ClassUtils.isAssignable(byte[].class, targetType.get())) { + sink.getBucket().put(StringUtils.hasText(path) ? path : "_raw", conversionService.convert(value, byte[].class)); } else { if (!ClassUtils.isAssignable(typeHint.getType(), value.getClass())) { diff --git a/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java b/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java index 9fbf1b99f..7448dbdb8 100644 --- a/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java +++ b/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java @@ -18,8 +18,6 @@ package org.springframework.data.redis.core.convert; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; import java.time.Duration; import java.time.Instant; @@ -241,13 +239,12 @@ public class ConversionTestEntities { } static class Inner { - + List values; } @RedisHash(KEYSPACE_ACCOUNT) - @Getter - @Setter + @Data public static class AccountInfo { @Id private String id; diff --git a/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java b/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java index 3f111b30d..59b9d3aea 100644 --- a/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java @@ -1847,6 +1847,43 @@ public class MappingRedisConverterUnitTests { assertThat(outer.inners.get(0).values).isEqualTo(Arrays.asList("i-1", "i-2")); } + @Test // DATAREDIS-911 + public void writeEntityWithCustomConverter() { + + this.converter = new MappingRedisConverter(null, null, resolverMock); + this.converter + .setCustomConversions(new RedisCustomConversions(Collections.singletonList(new AccountInfoToBytesConverter()))); + this.converter.afterPropertiesSet(); + + AccountInfo accountInfo = new AccountInfo(); + accountInfo.setId("ai-id-1"); + accountInfo.setAccount("123456"); + accountInfo.setAccountName("Inamur Rahman Sadid"); + + assertThat(write(accountInfo).getRedisData().getId()).isEqualTo(accountInfo.getId()); + } + + @Test // DATAREDIS-911 + public void readEntityWithCustomConverter() { + + this.converter = new MappingRedisConverter(null, null, resolverMock); + this.converter + .setCustomConversions(new RedisCustomConversions(Collections.singletonList(new BytesToAccountInfoConverter()))); + this.converter.afterPropertiesSet(); + + Bucket bucket = new Bucket(); + bucket.put("_raw", "ai-id-1|123456|Golam Mazid Sajib".getBytes(StandardCharsets.UTF_8)); + + RedisData redisData = new RedisData(bucket); + redisData.setKeyspace(KEYSPACE_ACCOUNT); + redisData.setId("ai-id-1"); + + AccountInfo target = converter.read(AccountInfo.class, redisData); + + assertThat(target.getAccount()).isEqualTo("123456"); + assertThat(target.getAccountName()).isEqualTo("Golam Mazid Sajib"); + } + private RedisTestData write(Object source) { RedisData rdo = new RedisData(); @@ -1947,43 +1984,6 @@ public class MappingRedisConverterUnitTests { } } - @Test // DATAREDIS-911 - public void writeEntityWithCustomConverter() { - - this.converter = new MappingRedisConverter(null, null, resolverMock); - this.converter - .setCustomConversions(new RedisCustomConversions(Collections.singletonList(new AccountInfoToBytesConverter()))); - this.converter.afterPropertiesSet(); - - AccountInfo accountInfo = new AccountInfo(); - accountInfo.setId("ai-id-1"); - accountInfo.setAccount("123456"); - accountInfo.setAccountName("Inamur Rahman Sadid"); - - assertThat(write(accountInfo).getRedisData().getId()).isEqualTo(accountInfo.getId()); - } - - @Test // DATAREDIS-911 - public void readEntityWithCustomConverter() { - - this.converter = new MappingRedisConverter(null, null, resolverMock); - this.converter - .setCustomConversions(new RedisCustomConversions(Collections.singletonList(new BytesToAccountInfoConverter()))); - this.converter.afterPropertiesSet(); - - Bucket bucket = new Bucket(); - bucket.put("_raw", "ai-id-1|123456|Golam Mazid Sajib".getBytes(StandardCharsets.UTF_8)); - - RedisData redisData = new RedisData(bucket); - redisData.setKeyspace(KEYSPACE_ACCOUNT); - redisData.setId("ai-id-1"); - - AccountInfo target = converter.read(AccountInfo.class, redisData); - - assertThat(target.getAccount()).isEqualTo("123456"); - assertThat(target.getAccountName()).isEqualTo("Golam Mazid Sajib"); - } - @WritingConverter static class AccountInfoToBytesConverter implements Converter {