JavaBean Introspection с необязательными типами возвращаемых данных - PullRequest
0 голосов
/ 20 января 2019
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?

1 Ответ

0 голосов
/ 21 января 2019

Ваш тест прерывается, потому что тип параметра OptionalBean::setFoo не соответствует типу возврата OptionalBean::getFoo.PropertyDescriptor относится к типу, и здесь Optional<String> и String не являются одинаковыми типами, даже если концептуально они прочно связаны.

В текущей реализации JavaBeans вы не можетеделай что хочешь.То, что вы могли бы сделать, это написать свой собственный BeanInfo -подобный объект, который делает за вас самоанализ, но не реализует BeanInfo.

...