Browse Source

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
pull/1/merge
Chris Beams 15 years ago
parent
commit
8dedf111bc
  1. 6
      org.springframework.beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java
  2. 21
      org.springframework.beans/src/test/java/org/springframework/beans/ExtendedBeanInfoTests.java

6
org.springframework.beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java

@ -82,6 +82,9 @@ public class ExtendedBeanInfo implements BeanInfo { @@ -82,6 +82,9 @@ public class ExtendedBeanInfo implements BeanInfo {
// 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 class ExtendedBeanInfo implements BeanInfo { @@ -109,6 +112,9 @@ public class ExtendedBeanInfo implements BeanInfo {
// 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)) {

21
org.springframework.beans/src/test/java/org/springframework/beans/ExtendedBeanInfoTests.java

@ -19,8 +19,6 @@ package org.springframework.beans; @@ -19,8 +19,6 @@ package org.springframework.beans;
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.IntrospectionException; @@ -32,7 +30,6 @@ import java.beans.IntrospectionException;
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 class ExtendedBeanInfoTests { @@ -485,6 +482,23 @@ public class ExtendedBeanInfoTests {
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 class ExtendedBeanInfoTests { @@ -545,7 +559,6 @@ public class ExtendedBeanInfoTests {
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)) {

Loading…
Cancel
Save