-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Labels
in: coreIssues in core supportIssues in core supportin: repositoryRepositories abstractionRepositories abstractiontype: bugA general bugA general bug
Milestone
Description
Maxim Novik opened DATAREDIS-509 and commented
MappingRedisConverter.writeInternal() does a check against properties. If they are "collection like" then there is an additional check for array. However, array is assumed to be an array of objects and is cast to Object[]. That does not work for array of primitives.
if (persistentProperty.isMap()) {
writeMap(keyspace, propertyStringPath, persistentProperty.getMapValueType(),
(Map<?, ?>) accessor.getProperty(persistentProperty), sink);
} else if (persistentProperty.isCollectionLike()) {
final Object property = accessor.getProperty(persistentProperty);
if (property == null || Iterable.class.isAssignableFrom(property.getClass())) {
writeCollection(keyspace, propertyStringPath, (Iterable<?>) property,
persistentProperty.getTypeInformation().getComponentType(), sink);
} else if (property.getClass().isArray()) {
writeCollection(keyspace, propertyStringPath, Arrays.asList((Object[]) property),
persistentProperty.getTypeInformation().getComponentType(), sink);
} else {
throw new RuntimeException("Don't know how to handle " + property.getClass() + " type collection");
}
If we add the following test to org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java:
@Test
public void writeHandlesArraysOfPrimitivesProperly() {
WithArrays source = new WithArrays();
source.arrayOfPrimitives = new int[] { 1, 2, 3 };
assertThat(write(source).getBucket(), isBucket().containingUtf8String("arrayOfPrimitives.[0]", "1")
.containingUtf8String("arrayOfPrimitives.[1]", "2")
.containingUtf8String("arrayOfPrimitives.[2]", "3"));
}
, it fails with:
java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object;
Affects: 1.7.1 (Hopper SR1)
Referenced from: pull request #196
Backported to: 1.7.2 (Hopper SR2)
Metadata
Metadata
Assignees
Labels
in: coreIssues in core supportIssues in core supportin: repositoryRepositories abstractionRepositories abstractiontype: bugA general bugA general bug