Browse Source

DATACMNS-1377 - ConvertingPropertyAccessor now properly coverts values for property paths.

Previously, ConvertingPropertyAccessor did not override PersistentPropertyAccessor.setProperty(PersistentPropertyPath, Object), so that the target value had to be of the leaf property's type. We now implement that method and convert it into that type before invoking the super method.
pull/309/merge
Oliver Gierke 7 years ago
parent
commit
b0eb0c47d2
No known key found for this signature in database
GPG Key ID: 6E42B5787543F690
  1. 13
      src/main/java/org/springframework/data/mapping/model/ConvertingPropertyAccessor.java
  2. 19
      src/test/java/org/springframework/data/mapping/PersistentPropertyAccessorUnitTests.java

13
src/main/java/org/springframework/data/mapping/model/ConvertingPropertyAccessor.java

@ -18,6 +18,7 @@ package org.springframework.data.mapping.model; @@ -18,6 +18,7 @@ package org.springframework.data.mapping.model;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.mapping.PersistentProperty;
import org.springframework.data.mapping.PersistentPropertyAccessor;
import org.springframework.data.mapping.PersistentPropertyPath;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@ -60,6 +61,18 @@ public class ConvertingPropertyAccessor<T> implements PersistentPropertyAccessor @@ -60,6 +61,18 @@ public class ConvertingPropertyAccessor<T> implements PersistentPropertyAccessor
accessor.setProperty(property, convertIfNecessary(value, property.getType()));
}
/*
* (non-Javadoc)
* @see org.springframework.data.mapping.PersistentPropertyAccessor#setProperty(org.springframework.data.mapping.PersistentPropertyPath, java.lang.Object)
*/
@Override
public void setProperty(PersistentPropertyPath<? extends PersistentProperty<?>> path, @Nullable Object value) {
Object converted = convertIfNecessary(value, path.getRequiredLeafProperty().getType());
PersistentPropertyAccessor.super.setProperty(path, converted);
}
/*
* (non-Javadoc)
* @see org.springframework.data.mapping.PersistentPropertyAccessor#getProperty(org.springframework.data.mapping.PersistentProperty)

19
src/test/java/org/springframework/data/mapping/PersistentPropertyAccessorUnitTests.java

@ -24,8 +24,10 @@ import lombok.Value; @@ -24,8 +24,10 @@ import lombok.Value;
import lombok.experimental.Wither;
import org.junit.Test;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.mapping.context.SampleMappingContext;
import org.springframework.data.mapping.context.SamplePersistentProperty;
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
/**
* @author Oliver Gierke
@ -114,6 +116,23 @@ public class PersistentPropertyAccessorUnitTests { @@ -114,6 +116,23 @@ public class PersistentPropertyAccessorUnitTests {
});
}
@Test // DATACMNS-1377
public void shouldConvertToPropertyPathLeafType() {
Order order = new Order(new Customer("1"));
PersistentPropertyAccessor<Order> accessor = context.getPersistentEntity(Order.class).getPropertyAccessor(order);
ConvertingPropertyAccessor<Order> convertingAccessor = new ConvertingPropertyAccessor<>(accessor,
new DefaultConversionService());
PersistentPropertyPath<SamplePersistentProperty> path = context.getPersistentPropertyPath("customer.firstname",
Order.class);
convertingAccessor.setProperty(path, 2);
assertThat(convertingAccessor.getBean().getCustomer().getFirstname()).isEqualTo("2");
}
@Value
static class Order {
Customer customer;

Loading…
Cancel
Save