DATACMNS-967 - Getters that are default methods are not considered projection input properties anymore.
We now exclude getter methods that are default methods from the consideration which properties of a projection interface are considered input properties in the first place. Some additional Java 8 polish in DefaultProjectionInformation.
This commit is contained in:
@@ -16,9 +16,11 @@
|
||||
package org.springframework.data.projection;
|
||||
|
||||
import java.beans.PropertyDescriptor;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.util.Assert;
|
||||
@@ -63,15 +65,9 @@ class DefaultProjectionInformation implements ProjectionInformation {
|
||||
*/
|
||||
public List<PropertyDescriptor> getInputProperties() {
|
||||
|
||||
List<PropertyDescriptor> result = new ArrayList<PropertyDescriptor>();
|
||||
|
||||
for (PropertyDescriptor descriptor : properties) {
|
||||
if (isInputProperty(descriptor)) {
|
||||
result.add(descriptor);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
return properties.stream()//
|
||||
.filter(it -> isInputProperty(it))//
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -104,7 +100,10 @@ class DefaultProjectionInformation implements ProjectionInformation {
|
||||
private static List<PropertyDescriptor> collectDescriptors(Class<?> type) {
|
||||
|
||||
List<PropertyDescriptor> result = new ArrayList<PropertyDescriptor>();
|
||||
result.addAll(Arrays.asList(BeanUtils.getPropertyDescriptors(type)));
|
||||
|
||||
result.addAll(Arrays.stream(BeanUtils.getPropertyDescriptors(type))//
|
||||
.filter(it -> !hasDefaultGetter(it))//
|
||||
.collect(Collectors.toList()));
|
||||
|
||||
for (Class<?> interfaze : type.getInterfaces()) {
|
||||
result.addAll(collectDescriptors(interfaze));
|
||||
@@ -112,4 +111,16 @@ class DefaultProjectionInformation implements ProjectionInformation {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the given {@link PropertyDescriptor} has a getter that is a Java 8 default method.
|
||||
*
|
||||
* @param descriptor must not be {@literal null}.
|
||||
* @return
|
||||
*/
|
||||
private static boolean hasDefaultGetter(PropertyDescriptor descriptor) {
|
||||
|
||||
Method method = descriptor.getReadMethod();
|
||||
return method == null ? false : method.isDefault();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,6 +96,10 @@ public class SpelAwareProxyProjectionFactory extends ProxyProjectionFactory impl
|
||||
@Override
|
||||
protected boolean isInputProperty(PropertyDescriptor descriptor) {
|
||||
|
||||
if (!super.isInputProperty(descriptor)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Method readMethod = descriptor.getReadMethod();
|
||||
|
||||
if (readMethod == null) {
|
||||
|
||||
Reference in New Issue
Block a user