Ignore generics when Proxy is supplied to BeanUtils.copyProperties()
gh-24281 introduced support to honor generic type information in BeanUtils.copyProperties(), but that introduced a regression. Specifically, if the supplied source or target object lacked generic type information for the return type of the read-method or the parameter type of the write-method for a given property, respectively, the two properties would be considered a mismatch and ignored. This can occur if the source or target object is a java.lang.reflect.Proxy since the dynamically generated class for the proxy loses the generic type information from interfaces that the proxy implements. This commit fixes this regression by ignoring generic type information if either the source or target property is lacking generic type information. Closes gh-26531
This commit is contained in:
@@ -776,7 +776,14 @@ public abstract class BeanUtils {
|
||||
if (readMethod != null) {
|
||||
ResolvableType sourceResolvableType = ResolvableType.forMethodReturnType(readMethod);
|
||||
ResolvableType targetResolvableType = ResolvableType.forMethodParameter(writeMethod, 0);
|
||||
if (targetResolvableType.isAssignableFrom(sourceResolvableType)) {
|
||||
|
||||
// Ignore generic types in assignable check if either ResolvableType has unresolvable generics.
|
||||
boolean isAssignable =
|
||||
(sourceResolvableType.hasUnresolvableGenerics() || targetResolvableType.hasUnresolvableGenerics() ?
|
||||
ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType()) :
|
||||
targetResolvableType.isAssignableFrom(sourceResolvableType));
|
||||
|
||||
if (isAssignable) {
|
||||
try {
|
||||
if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
|
||||
readMethod.setAccessible(true);
|
||||
|
||||
Reference in New Issue
Block a user