Consistent bridge method handling in annotation post-processors
Issue: SPR-12490 Issue: SPR-12495
This commit is contained in:
@@ -378,13 +378,28 @@ public abstract class BeanUtils {
|
||||
* Find a JavaBeans {@code PropertyDescriptor} for the given method,
|
||||
* with the method either being the read method or the write method for
|
||||
* that bean property.
|
||||
* @param method the method to find a corresponding PropertyDescriptor for
|
||||
* @param method the method to find a corresponding PropertyDescriptor for,
|
||||
* introspecting its declaring class
|
||||
* @return the corresponding PropertyDescriptor, or {@code null} if none
|
||||
* @throws BeansException if PropertyDescriptor lookup fails
|
||||
*/
|
||||
public static PropertyDescriptor findPropertyForMethod(Method method) throws BeansException {
|
||||
return findPropertyForMethod(method, method.getDeclaringClass());
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a JavaBeans {@code PropertyDescriptor} for the given method,
|
||||
* with the method either being the read method or the write method for
|
||||
* that bean property.
|
||||
* @param method the method to find a corresponding PropertyDescriptor for
|
||||
* @param clazz the (most specific) class to introspect for descriptors
|
||||
* @return the corresponding PropertyDescriptor, or {@code null} if none
|
||||
* @throws BeansException if PropertyDescriptor lookup fails
|
||||
* @since 4.0.9
|
||||
*/
|
||||
public static PropertyDescriptor findPropertyForMethod(Method method, Class<?> clazz) throws BeansException {
|
||||
Assert.notNull(method, "Method must not be null");
|
||||
PropertyDescriptor[] pds = getPropertyDescriptors(method.getDeclaringClass());
|
||||
PropertyDescriptor[] pds = getPropertyDescriptors(clazz);
|
||||
for (PropertyDescriptor pd : pds) {
|
||||
if (method.equals(pd.getReadMethod()) || method.equals(pd.getWriteMethod())) {
|
||||
return pd;
|
||||
@@ -590,11 +605,11 @@ public abstract class BeanUtils {
|
||||
actualEditable = editable;
|
||||
}
|
||||
PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
|
||||
List<String> ignoreList = (ignoreProperties != null) ? Arrays.asList(ignoreProperties) : null;
|
||||
List<String> ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null);
|
||||
|
||||
for (PropertyDescriptor targetPd : targetPds) {
|
||||
Method writeMethod = targetPd.getWriteMethod();
|
||||
if (writeMethod != null && (ignoreProperties == null || (!ignoreList.contains(targetPd.getName())))) {
|
||||
if (writeMethod != null && (ignoreList == null || (!ignoreList.contains(targetPd.getName())))) {
|
||||
PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
|
||||
if (sourcePd != null) {
|
||||
Method readMethod = sourcePd.getReadMethod();
|
||||
|
||||
@@ -397,14 +397,11 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
|
||||
}
|
||||
}
|
||||
for (Method method : targetClass.getDeclaredMethods()) {
|
||||
AnnotationAttributes ann = null;
|
||||
Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
|
||||
if (BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {
|
||||
ann = findAutowiredAnnotation(bridgedMethod);
|
||||
}
|
||||
else if (!method.isBridge()) {
|
||||
ann = findAutowiredAnnotation(method);
|
||||
if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {
|
||||
continue;
|
||||
}
|
||||
AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod);
|
||||
if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {
|
||||
if (Modifier.isStatic(method.getModifiers())) {
|
||||
if (logger.isWarnEnabled()) {
|
||||
@@ -418,7 +415,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
|
||||
}
|
||||
}
|
||||
boolean required = determineRequiredStatus(ann);
|
||||
PropertyDescriptor pd = BeanUtils.findPropertyForMethod(method);
|
||||
PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);
|
||||
currElements.add(new AutowiredMethodElement(method, required, pd));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user