Adapt to renamed properties by using MappedProperties in association deserialization.
Revert the changes that employed manual annotation lookup as that would cause invalid associations of fields and accessor methods for properties shadow renamed. Instead, we now use MappedProperties that already contains a mapping between the Jackson field names and Spring Data property names. Fixes: #2165 $ Conflicts: $ spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/PersistentEntityJackson2Module.java $ spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/PersistentEntityJackson2ModuleUnitTests.java
This commit is contained in:
@@ -151,6 +151,10 @@ class MappedProperties {
|
||||
return new MappedProperties(entity, description);
|
||||
}
|
||||
|
||||
public static MappedProperties forDescription(PersistentEntity<?, ?> entity, BeanDescription description) {
|
||||
return new MappedProperties(entity, description);
|
||||
}
|
||||
|
||||
public static MappedProperties none() {
|
||||
return new MappedProperties(Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet(),
|
||||
Collections.emptySet(), false);
|
||||
|
||||
@@ -461,10 +461,12 @@ public class PersistentEntityJackson2Module extends SimpleModule {
|
||||
|
||||
entities.getPersistentEntity(beanDesc.getBeanClass()).ifPresent(entity -> {
|
||||
|
||||
MappedProperties mapped = MappedProperties.forDescription(entity, beanDesc);
|
||||
|
||||
while (properties.hasNext()) {
|
||||
|
||||
SettableBeanProperty property = properties.next();
|
||||
PersistentProperty<?> persistentProperty = entity.getPersistentProperty(property.getName());
|
||||
PersistentProperty<?> persistentProperty = mapped.getPersistentProperty(property.getName());
|
||||
|
||||
if (persistentProperty == null) {
|
||||
continue;
|
||||
|
||||
@@ -157,6 +157,40 @@ class PersistentEntityJackson2ModuleUnitTests {
|
||||
assertThat(petOwner.getPet()).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void allowsUrlsForLinkableAssociation() throws Exception {
|
||||
|
||||
when(converter.convert(UriTemplate.of("/homes/1").expand(), TypeDescriptor.valueOf(URI.class),
|
||||
TypeDescriptor.valueOf(Home.class))).thenReturn(new Home());
|
||||
|
||||
PersistentProperty<?> property = persistentEntities.getRequiredPersistentEntity(PetOwner.class)
|
||||
.getRequiredPersistentProperty("home");
|
||||
|
||||
when(associations.isLinkableAssociation(property)).thenReturn(true);
|
||||
|
||||
PetOwner petOwner = mapper.readValue("{\"home\": \"/homes/1\" }", PetOwner.class);
|
||||
|
||||
assertThat(petOwner).isNotNull();
|
||||
assertThat(petOwner.getHome()).isInstanceOf(Home.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void allowsUrlsForRenamedLinkableAssociation() throws IOException {
|
||||
|
||||
when(converter.convert(UriTemplate.of("/packages/1").expand(), TypeDescriptor.valueOf(URI.class),
|
||||
TypeDescriptor.valueOf(Package.class))).thenReturn(new Package());
|
||||
|
||||
PersistentProperty<?> property = persistentEntities.getRequiredPersistentEntity(PetOwner.class)
|
||||
.getRequiredPersistentProperty("_package");
|
||||
|
||||
when(associations.isLinkableAssociation(property)).thenReturn(true);
|
||||
|
||||
PetOwner petOwner = mapper.readValue("{\"package\":\"/packages/1\"}", PetOwner.class);
|
||||
|
||||
assertThat(petOwner).isNotNull();
|
||||
assertThat(petOwner._package).isNotNull();
|
||||
}
|
||||
|
||||
@Test // DATAREST-1321
|
||||
void allowsNumericIdsForLookupTypes() throws Exception {
|
||||
|
||||
@@ -260,8 +294,12 @@ class PersistentEntityJackson2ModuleUnitTests {
|
||||
|
||||
Pet pet;
|
||||
Home home;
|
||||
|
||||
@JsonProperty("package") Package _package;
|
||||
}
|
||||
|
||||
static class Package {}
|
||||
|
||||
@JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.MINIMAL_CLASS)
|
||||
static class Pet {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user