具有可选 return 类型的 JavaBean 自省
JavaBean Introspection with Optional return types
java.beans.Introspector#getBeanInfo
在将 getter return 类型更改为 com.google.common.base.Optional
时编译不完整的 PropertyDescriptor
。
我正在使用 Java 7,因此必须使用 Guava 的 Optional
。我想在我的 JavaBeans 中将其用作 return 类型。
我准备了这两个小单元测试来概述问题:
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
.
尽管将 return 类型更改为 Optional
,但如何更改此行为才能接收完整的 PropertyDescriptor
?
您的测试失败,因为 OptionalBean::setFoo
的参数类型与 OptionalBean::getFoo
的 return 类型不匹配。 PropertyDescriptor
特定于一种类型,这里 Optional<String>
和 String
不是同一类型,即使在概念上它们是紧密联系的。
使用当前的 JavaBeans 实现,您不能做您想做的事。您可以 做的是编写您自己的类似于 BeanInfo
的对象,它为您进行内省但不实现 BeanInfo
.
java.beans.Introspector#getBeanInfo
在将 getter return 类型更改为 com.google.common.base.Optional
时编译不完整的 PropertyDescriptor
。
我正在使用 Java 7,因此必须使用 Guava 的 Optional
。我想在我的 JavaBeans 中将其用作 return 类型。
我准备了这两个小单元测试来概述问题:
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
.
尽管将 return 类型更改为 Optional
,但如何更改此行为才能接收完整的 PropertyDescriptor
?
您的测试失败,因为 OptionalBean::setFoo
的参数类型与 OptionalBean::getFoo
的 return 类型不匹配。 PropertyDescriptor
特定于一种类型,这里 Optional<String>
和 String
不是同一类型,即使在概念上它们是紧密联系的。
使用当前的 JavaBeans 实现,您不能做您想做的事。您可以 做的是编写您自己的类似于 BeanInfo
的对象,它为您进行内省但不实现 BeanInfo
.