Skip to content

Commit e2ca1be

Browse files
DATAREDIS-425 - Throw DataAccessException for missing converters during indexing.
1 parent 7534d08 commit e2ca1be

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

src/main/java/org/springframework/data/redis/core/IndexWriter.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Set;
1919

20+
import org.springframework.dao.InvalidDataAccessApiUsageException;
2021
import org.springframework.data.redis.connection.RedisConnection;
2122
import org.springframework.data.redis.core.convert.IndexedData;
2223
import org.springframework.data.redis.core.convert.RedisConverter;
@@ -180,6 +181,14 @@ private byte[] toBytes(Object source) {
180181
return (byte[]) source;
181182
}
182183

183-
return converter.getConversionService().convert(source, byte[].class);
184+
if (converter.getConversionService().canConvert(source.getClass(), byte[].class)) {
185+
return converter.getConversionService().convert(source, byte[].class);
186+
}
187+
188+
throw new InvalidDataAccessApiUsageException(
189+
String
190+
.format(
191+
"Cannot convert %s to binary representation for index key generation. Are you missing a Converter? Did you register a non PathBasedRedisIndexDefinition that might apply to a complex type?",
192+
source.getClass()));
184193
}
185194
}

src/test/java/org/springframework/data/redis/core/IndexWriterUnitTests.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,17 @@
3030
import org.mockito.ArgumentCaptor;
3131
import org.mockito.Mock;
3232
import org.mockito.runners.MockitoJUnitRunner;
33+
import org.springframework.core.convert.converter.Converter;
34+
import org.springframework.core.convert.support.GenericConversionService;
35+
import org.springframework.dao.InvalidDataAccessApiUsageException;
3336
import org.springframework.data.redis.connection.RedisConnection;
34-
import org.springframework.data.redis.core.convert.PathIndexResolver;
3537
import org.springframework.data.redis.core.convert.IndexedData;
3638
import org.springframework.data.redis.core.convert.MappingRedisConverter;
39+
import org.springframework.data.redis.core.convert.PathIndexResolver;
3740
import org.springframework.data.redis.core.convert.ReferenceResolver;
3841
import org.springframework.data.redis.core.convert.SimpleIndexedPropertyValue;
3942
import org.springframework.data.redis.core.mapping.RedisMappingContext;
43+
import org.springframework.util.ObjectUtils;
4044

4145
/**
4246
* @author Christoph Strobl
@@ -50,15 +54,15 @@ public class IndexWriterUnitTests {
5054
private static final String KEY = "key-1";
5155
private static final byte[] KEY_BIN = KEY.getBytes(CHARSET);
5256
IndexWriter writer;
57+
MappingRedisConverter converter;
5358

5459
@Mock RedisConnection connectionMock;
5560
@Mock ReferenceResolver referenceResolverMock;
5661

5762
@Before
5863
public void setUp() {
5964

60-
MappingRedisConverter converter = new MappingRedisConverter(new RedisMappingContext(), new PathIndexResolver(),
61-
referenceResolverMock);
65+
converter = new MappingRedisConverter(new RedisMappingContext(), new PathIndexResolver(), referenceResolverMock);
6266
converter.afterPropertiesSet();
6367

6468
writer = new IndexWriter(connectionMock, converter);
@@ -143,6 +147,37 @@ public void removeAllIndexesShouldDeleteAllIndexKeys() {
143147
assertThat(captor.getAllValues(), hasItems(indexKey1, indexKey2));
144148
}
145149

150+
/**
151+
* @see DATAREDIS-425
152+
*/
153+
@Test(expected = InvalidDataAccessApiUsageException.class)
154+
public void addToIndexShouldThrowDataAccessExceptionWhenAddingDataThatConnotBeConverted() {
155+
writer.addKeyToIndex(KEY_BIN, new SimpleIndexedPropertyValue(KEYSPACE, "firstname", new DummyObject()));
156+
157+
}
158+
159+
/**
160+
* @see DATAREDIS-425
161+
*/
162+
@Test
163+
public void addToIndexShouldUseRegisteredConverterWhenAddingData() {
164+
165+
DummyObject value = new DummyObject();
166+
final String identityHexString = ObjectUtils.getIdentityHexString(value);
167+
168+
((GenericConversionService) converter.getConversionService()).addConverter(new Converter<DummyObject, byte[]>() {
169+
170+
@Override
171+
public byte[] convert(DummyObject source) {
172+
return identityHexString.getBytes(CHARSET);
173+
}
174+
});
175+
176+
writer.addKeyToIndex(KEY_BIN, new SimpleIndexedPropertyValue(KEYSPACE, "firstname", value));
177+
178+
verify(connectionMock).sAdd(eq(("persons:firstname:" + identityHexString).getBytes(CHARSET)), eq(KEY_BIN));
179+
}
180+
146181
static class StubIndxedData implements IndexedData {
147182

148183
@Override
@@ -154,6 +189,9 @@ public String getIndexName() {
154189
public String getKeySpace() {
155190
return KEYSPACE;
156191
}
192+
}
193+
194+
static class DummyObject {
157195

158196
}
159197
}

0 commit comments

Comments
 (0)