【问题标题】:JavaBean Introspection with Optional return types具有可选返回类型的 JavaBean 内省
【发布时间】:2019-06-14 02:18:55
【问题描述】:
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。大概 Introspector 将 foo 匹配到类型 Optional 而不是 String

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

【问题讨论】:

    标签: java javabeans guava optional introspection


    【解决方案1】:

    您的测试中断是因为OptionalBean::setFoo 的参数类型与OptionalBean::getFoo 的返回类型不匹配。 PropertyDescriptor 特定于一个类型,在这里,Optional&lt;String&gt;String 不是同一个类型,即使它们在概念上是强关联的。

    使用 JavaBeans 的当前实现,你不能做你想做的事。您可以做的是编写自己的 BeanInfo 类对象,该对象为您进行自省但不实现 BeanInfo

    【讨论】:

    • 非常感谢您的回答。我希望有一个更简单的解决方案或 Introspector 的一些扩展点,但显然我必须一路走下去。
    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2016-10-04
    相关资源
    最近更新 更多