具有可选返回类型的JavaBean内省
将getter返回类型更改为具有可选返回类型的JavaBean内省,java,javabeans,guava,optional,introspection,Java,Javabeans,Guava,Optional,Introspection,将getter返回类型更改为com.google.common.base.Optional时编译不完整的PropertyDescriptor 我使用的是Java7,因此必须使用Guava的可选。我想在JavaBeans中使用它作为返回类型。 我准备了以下两个小单元测试来概述问题: java.beans.Introspector#getBeanInfo import static org.junit.Assert.*; 导入java.beans.BeanInfo; 导入java.beans.In
com.google.common.base.Optional
时编译不完整的PropertyDescriptor
我使用的是Java7,因此必须使用Guava的可选。我想在JavaBeans中使用它作为返回类型。
我准备了以下两个小单元测试来概述问题:
java.beans.Introspector#getBeanInfo
import static org.junit.Assert.*;
导入java.beans.BeanInfo;
导入java.beans.IntrospectionException;
导入java.beans.Introspector;
导入java.beans.PropertyDescriptor;
导入org.junit.Test;
导入com.google.common.base.Optional;
公共类beanoptional测试{
类SimpleBean{
私人字符串foo;
公共字符串getFoo(){return foo;}
public void setFoo(字符串foo){this.foo=foo;}
}
@试验
public void test_SimpleBean()引发异常{
assertFooProperty(SimpleBean.class);
}
类OptionalBean{
私人字符串foo;
公共可选getFoo(){return Optional.fromNullable(foo);}
public void setFoo(字符串foo){this.foo=foo;}
}
@试验
public void test_OptionalBean()引发异常{
assertFooProperty(OptionalBean.class);
}
私有void assertFooProperty(类beanClass)引发内省异常{
BeanInfo BeanInfo=内省者.getBeanInfo(beanClass);
assertEquals(2,beanInfo.getPropertyDescriptors().length);
PropertyDescriptor foodDescriptor=beanInfo.getPropertyDescriptors()[1];
assertNotNull(foodDescriptor.getReadMethod());
assertEquals(“getFoo”,foodDescriptor.getReadMethod().getName());
assertNotNull(fooDescriptor.getWriteMethod());
assertEquals(“setFoo”,fooDescriptor.getWriteMethod().getName());
}
}
test\u OptionalBean
失败,因为写入方法为null
。大概内省者会将foo与类型Optional
匹配,而不是字符串
尽管将返回类型更改为Optional
,但如何更改此行为以接收完整的PropertyDescriptor
?由于OptionalBean::setFoo
的参数类型与OptionalBean::getFoo
的返回类型不匹配,测试将中断。PropertyDescriptor
是特定于某个类型的,在这里,Optional
和String
不是同一类型,即使它们在概念上有很强的链接
在当前的JavaBeans实现中,您不能做您想做的事情。您可以编写自己的BeanInfo
-类似对象,它为您进行内省,但不实现BeanInfo
非常感谢您的回答。我希望有一个更简单的解决方案或内省的扩展点,但显然我必须一路走下去。
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());
}
}