Restore ability to configure setClassLoader methods
Closes gh-28269
This commit is contained in:
parent
7aed6279a2
commit
9f91168396
|
|
@ -287,13 +287,15 @@ public final class CachedIntrospectionResults {
|
||||||
// This call is slow so we do it once.
|
// This call is slow so we do it once.
|
||||||
PropertyDescriptor[] pds = this.beanInfo.getPropertyDescriptors();
|
PropertyDescriptor[] pds = this.beanInfo.getPropertyDescriptors();
|
||||||
for (PropertyDescriptor pd : pds) {
|
for (PropertyDescriptor pd : pds) {
|
||||||
if (Class.class == beanClass && (!"name".equals(pd.getName()) && !pd.getName().endsWith("Name"))) {
|
if (Class.class == beanClass && !("name".equals(pd.getName()) ||
|
||||||
|
(pd.getName().endsWith("Name") && String.class == pd.getPropertyType()))) {
|
||||||
// Only allow all name variants of Class properties
|
// Only allow all name variants of Class properties
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pd.getPropertyType() != null && (ClassLoader.class.isAssignableFrom(pd.getPropertyType())
|
if (pd.getWriteMethod() == null && pd.getPropertyType() != null &&
|
||||||
|| ProtectionDomain.class.isAssignableFrom(pd.getPropertyType()))) {
|
(ClassLoader.class.isAssignableFrom(pd.getPropertyType()) ||
|
||||||
// Ignore ClassLoader and ProtectionDomain types - nobody needs to bind to those
|
ProtectionDomain.class.isAssignableFrom(pd.getPropertyType()))) {
|
||||||
|
// Ignore ClassLoader and ProtectionDomain read-only properties - no need to bind to those
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (logger.isTraceEnabled()) {
|
if (logger.isTraceEnabled()) {
|
||||||
|
|
@ -342,9 +344,10 @@ public final class CachedIntrospectionResults {
|
||||||
// GenericTypeAwarePropertyDescriptor leniently resolves a set* write method
|
// GenericTypeAwarePropertyDescriptor leniently resolves a set* write method
|
||||||
// against a declared read method, so we prefer read method descriptors here.
|
// against a declared read method, so we prefer read method descriptors here.
|
||||||
pd = buildGenericTypeAwarePropertyDescriptor(beanClass, pd);
|
pd = buildGenericTypeAwarePropertyDescriptor(beanClass, pd);
|
||||||
if (pd.getPropertyType() != null && (ClassLoader.class.isAssignableFrom(pd.getPropertyType())
|
if (pd.getWriteMethod() == null && pd.getPropertyType() != null &&
|
||||||
|| ProtectionDomain.class.isAssignableFrom(pd.getPropertyType()))) {
|
(ClassLoader.class.isAssignableFrom(pd.getPropertyType()) ||
|
||||||
// Ignore ClassLoader and ProtectionDomain types - nobody needs to bind to those
|
ProtectionDomain.class.isAssignableFrom(pd.getPropertyType()))) {
|
||||||
|
// Ignore ClassLoader and ProtectionDomain read-only properties - no need to bind to those
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
this.propertyDescriptors.put(pd.getName(), pd);
|
this.propertyDescriptors.put(pd.getName(), pd);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2021 the original author or authors.
|
* Copyright 2002-2022 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -23,6 +23,8 @@ import java.util.Optional;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.beans.testfixture.beans.TestBean;
|
import org.springframework.beans.testfixture.beans.TestBean;
|
||||||
|
import org.springframework.core.OverridingClassLoader;
|
||||||
|
import org.springframework.core.io.DefaultResourceLoader;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||||
|
|
@ -157,12 +159,34 @@ class BeanWrapperTests extends AbstractPropertyAccessorTests {
|
||||||
BeanWrapper accessor = createAccessor(target);
|
BeanWrapper accessor = createAccessor(target);
|
||||||
accessor.setPropertyValue("name", "a");
|
accessor.setPropertyValue("name", "a");
|
||||||
accessor.setPropertyValue("spouse.name", "b");
|
accessor.setPropertyValue("spouse.name", "b");
|
||||||
|
|
||||||
assertThat(target.getName()).isEqualTo("a");
|
assertThat(target.getName()).isEqualTo("a");
|
||||||
assertThat(target.getSpouse().getName()).isEqualTo("b");
|
assertThat(target.getSpouse().getName()).isEqualTo("b");
|
||||||
assertThat(accessor.getPropertyValue("name")).isEqualTo("a");
|
assertThat(accessor.getPropertyValue("name")).isEqualTo("a");
|
||||||
assertThat(accessor.getPropertyValue("spouse.name")).isEqualTo("b");
|
assertThat(accessor.getPropertyValue("spouse.name")).isEqualTo("b");
|
||||||
assertThat(accessor.getPropertyDescriptor("name").getPropertyType()).isEqualTo(String.class);
|
assertThat(accessor.getPropertyDescriptor("name").getPropertyType()).isEqualTo(String.class);
|
||||||
assertThat(accessor.getPropertyDescriptor("spouse.name").getPropertyType()).isEqualTo(String.class);
|
assertThat(accessor.getPropertyDescriptor("spouse.name").getPropertyType()).isEqualTo(String.class);
|
||||||
|
|
||||||
|
assertThat(accessor.isReadableProperty("class.package")).isFalse();
|
||||||
|
assertThat(accessor.isReadableProperty("class.module")).isFalse();
|
||||||
|
assertThat(accessor.isReadableProperty("class.classLoader")).isFalse();
|
||||||
|
assertThat(accessor.isReadableProperty("class.name")).isTrue();
|
||||||
|
assertThat(accessor.isReadableProperty("class.simpleName")).isTrue();
|
||||||
|
assertThat(accessor.getPropertyValue("class.name")).isEqualTo(TestBean.class.getName());
|
||||||
|
assertThat(accessor.getPropertyValue("class.simpleName")).isEqualTo(TestBean.class.getSimpleName());
|
||||||
|
assertThat(accessor.getPropertyDescriptor("class.name").getPropertyType()).isEqualTo(String.class);
|
||||||
|
assertThat(accessor.getPropertyDescriptor("class.simpleName").getPropertyType()).isEqualTo(String.class);
|
||||||
|
|
||||||
|
accessor = createAccessor(new DefaultResourceLoader());
|
||||||
|
|
||||||
|
assertThat(accessor.isReadableProperty("class.package")).isFalse();
|
||||||
|
assertThat(accessor.isReadableProperty("class.module")).isFalse();
|
||||||
|
assertThat(accessor.isReadableProperty("class.classLoader")).isFalse();
|
||||||
|
assertThat(accessor.isReadableProperty("classLoader")).isTrue();
|
||||||
|
assertThat(accessor.isWritableProperty("classLoader")).isTrue();
|
||||||
|
OverridingClassLoader ocl = new OverridingClassLoader(getClass().getClassLoader());
|
||||||
|
accessor.setPropertyValue("classLoader", ocl);
|
||||||
|
assertThat(accessor.getPropertyValue("classLoader")).isSameAs(ocl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue