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:
Oliver Gierke
2016-12-23 12:53:36 +01:00
parent c6cc535ede
commit 9137dc7c70
2 changed files with 39 additions and 2 deletions

View File

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

View File

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