Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有可选返回类型的JavaBean内省_Java_Javabeans_Guava_Optional_Introspection - Fatal编程技术网

具有可选返回类型的JavaBean内省

具有可选返回类型的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

将getter返回类型更改为
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());
  }
}