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. Unfortunately no tests for this one as we can't declare default methods in our codebase requiring JDK 6 compatibility.
This commit is contained in:
@@ -16,11 +16,12 @@
|
||||
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 org.springframework.beans.BeanUtils;
|
||||
import org.springframework.data.util.ReflectionUtils;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
@@ -104,7 +105,7 @@ 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(filterDefaultMethods(BeanUtils.getPropertyDescriptors(type)));
|
||||
|
||||
for (Class<?> interfaze : type.getInterfaces()) {
|
||||
result.addAll(collectDescriptors(interfaze));
|
||||
@@ -112,4 +113,36 @@ class DefaultProjectionInformation implements ProjectionInformation {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all {@link PropertyDescriptor}s that don't have a Java 8 default method as getter.
|
||||
*
|
||||
* @param descriptors must not be {@literal null}.
|
||||
* @return
|
||||
*/
|
||||
private static List<PropertyDescriptor> filterDefaultMethods(PropertyDescriptor[] descriptors) {
|
||||
|
||||
List<PropertyDescriptor> result = new ArrayList<PropertyDescriptor>(descriptors.length);
|
||||
|
||||
for (PropertyDescriptor descriptor : descriptors) {
|
||||
if (!hasDefaultGetter(descriptor)) {
|
||||
result.add(descriptor);
|
||||
}
|
||||
}
|
||||
|
||||
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 : ReflectionUtils.isDefaultMethod(method);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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