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:
Oliver Drotbohm
2023-02-21 13:24:39 +01:00
parent 34036ba3ab
commit a027727a46
3 changed files with 45 additions and 1 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 {}