JavaBean Introspection with Optional return types


java.beans.Introspector#getBeanInfo

将 getter 返回类型更改为 com.google.common.base.Optional 时编译不完整的PropertyDescriptor

我使用的是Java 7,因此必须使用Guava的Optional。我想在我的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 。据推测,内省器将 foo 与类型 Optional 而不是 String 匹配。

尽管将返回类型更改为Optional,如何更改此行为以接收完整的PropertyDescriptor

您的测试中断,因为 OptionalBean::setFoo 参数的类型与返回类型不匹配 OptionalBean::getFooPropertyDescriptor特定于类型,在这里,Optional<String>String不是同一类型,即使它们在概念上是紧密链接的。

使用JavaBeans的当前实现,您无法执行该执行的操作。你可以做的是编写你自己的类似BeanInfo的对象,为你做内省,但不实现BeanInfo

相关内容

最新更新