Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Ignore non-prop 'set' methods in ExtendedBeanInfo

Previously, ExtendedBeanInfo would attempt to process methods named
exactly 'set'.  JavaBeans properties must have at least one character
following the 'set' prefix in order to qualify, and this is now
respected by EBI.

Thanks to Rob Winch for the patch fixing this problem.

Issue: SPR-8175

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4178 50f2f4bb-b051-0410-bef5-90022cba6387
  • Loading branch information...
commit 8dedf111bcf08af967c2de00b3e1ee4e99979533 1 parent 772aee7
@cbeams authored
View
6 org.springframework.beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java
@@ -82,6 +82,9 @@ public ExtendedBeanInfo(BeanInfo delegate) throws IntrospectionException {
// is the method a NON-INDEXED setter? ignore return type in order to capture non-void signatures
if (method.getName().startsWith("set") && method.getParameterTypes().length == 1) {
String propertyName = propertyNameFor(method);
+ if(propertyName.length() == 0) {
+ continue ALL_METHODS;
+ }
for (PropertyDescriptor pd : delegate.getPropertyDescriptors()) {
Method readMethod = pd.getReadMethod();
Method writeMethod = pd.getWriteMethod();
@@ -109,6 +112,9 @@ public ExtendedBeanInfo(BeanInfo delegate) throws IntrospectionException {
// is the method an INDEXED setter? ignore return type in order to capture non-void signatures
if (method.getName().startsWith("set") && method.getParameterTypes().length == 2 && method.getParameterTypes()[0].equals(int.class)) {
String propertyName = propertyNameFor(method);
+ if(propertyName.length() == 0) {
+ continue ALL_METHODS;
+ }
DELEGATE_PD:
for (PropertyDescriptor pd : delegate.getPropertyDescriptors()) {
if (!(pd instanceof IndexedPropertyDescriptor)) {
View
21 org.springframework.beans/src/test/java/org/springframework/beans/ExtendedBeanInfoTests.java
@@ -19,8 +19,6 @@
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.lessThan;
import static org.junit.Assert.assertThat;
@@ -32,7 +30,6 @@
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
-import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.ExtendedBeanInfo.PropertyDescriptorComparator;
@@ -485,6 +482,23 @@ public void setFoo(String foo) { }
assertThat(hasWriteMethodForProperty(ebi, "foo"), is(true));
}
+ /**
+ * Ensures that an empty string is not passed into a PropertyDescriptor constructor. This
+ * could occur when handling ArrayList.set(int,Object)
+ */
+ @Test
+ public void emptyPropertiesIgnored() throws IntrospectionException {
+ @SuppressWarnings("unused") class C {
+ public Object set(Object o) { return null; }
+ public Object set(int i, Object o) { return null; }
+ }
+
+ BeanInfo bi = Introspector.getBeanInfo(C.class);
+ ExtendedBeanInfo ebi = new ExtendedBeanInfo(bi);
+
+ assertThat(ebi.getPropertyDescriptors(), equalTo(bi.getPropertyDescriptors()));
+ }
+
@Test
public void propertyCountsMatch() throws IntrospectionException {
BeanInfo bi = Introspector.getBeanInfo(TestBean.class);
@@ -545,7 +559,6 @@ public void propertyDescriptorComparator() throws IntrospectionException {
assertThat(c.compare(new PropertyDescriptor("a", null, null), new PropertyDescriptor("A", null, null)), greaterThan(0));
}
-
private boolean hasWriteMethodForProperty(BeanInfo beanInfo, String propertyName) {
for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
if (pd.getName().equals(propertyName)) {
Please sign in to comment.
Something went wrong with that request. Please try again.