java.beans.Introspector#getBeanInfo
компилирует неполный PropertyDescriptor
при изменении типа возвращаемого значения получателя на com.google.common.base.Optional
.
Я использую Java 7 и, следовательно, должен использовать Optional
в Guava.Я хотел бы использовать его в качестве типов возврата в моем JavaBeans.Я подготовил эти два небольших модульных теста, чтобы обрисовать проблему:
import static org.junit.Assert.*;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import org.junit.Test;
import com.google.common.base.Optional;
public class BeanOptionalTest {
class SimpleBean {
private String foo;
public String getFoo() { return foo; }
public void setFoo(String foo) { this.foo = foo; }
}
@Test
public void test_SimpleBean() throws Exception {
assertFooProperty(SimpleBean.class);
}
class OptionalBean {
private String foo;
public Optional<String> getFoo() { return Optional.fromNullable(foo); }
public void setFoo(String foo) { this.foo = foo; }
}
@Test
public void test_OptionalBean() throws Exception {
assertFooProperty(OptionalBean.class);
}
private void assertFooProperty(Class<?> beanClass) throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
assertEquals(2, beanInfo.getPropertyDescriptors().length);
PropertyDescriptor fooDescriptor = beanInfo.getPropertyDescriptors()[1];
assertNotNull(fooDescriptor.getReadMethod());
assertEquals("getFoo", fooDescriptor.getReadMethod().getName());
assertNotNull(fooDescriptor.getWriteMethod());
assertEquals("setFoo", fooDescriptor.getWriteMethod().getName());
}
}
test_OptionalBean
завершается неудачно, потому что метод записи - null
.Предположительно Introspector сопоставляет foo с типом Optional
вместо String
.
Как можно изменить это поведение, чтобы получить полный PropertyDescriptor
несмотря на изменение типа возвращаемого значения на Optional
?