org.apache.commons.beanutils.PropertyUtils.getNestedProperty()

时间:2019-06-24 07:34:31

标签: java javabeans apache-commons-beanutils propertydescriptor

已经有自动生成的类,它们与声明其字段名称无关。尝试使用org.apache.commons.beanutils.PropertyUtils.getNestedProperty(Object bean, String name)获取类的对象类型字段时,遇到错误:

  

java.lang.NoSuchMethodException:类上的未知属性'lSASPro'   'xyz'

有问题的字段名称类似于lSASPro或类似的名称,它们以一个小写字母和一个大写字母顺序开头。 (lSASPro在PropertyDescriptor步骤中将变成LSASPro,因此以下代码中的getPropertyDescriptor()返回null

// The file: org.apache.commons.beanutils.PropertyUtilsBean.java

// Retrieve the property getter method for the specified property
final PropertyDescriptor descriptor =
        getPropertyDescriptor(bean, name);
if (descriptor == null) {
    throw new NoSuchMethodException("Unknown property '" +
            name + "' on class '" + bean.getClass() + "'" );
}

这是由于在Java Beans中声明了 PropertyDescriptor 的行为,该行为获得具有以下规范(source)的字段名称:

  

因此,当我们从现有Java名称的中间提取属性或事件名称时,通常会将第一个字符转换为小写。但是,为了支持偶尔使用所有大写的名称,我们检查名称的前两个字符是否均为大写,是否保留为大写。例如:

     
      
  • FooBah成为fooBah
  •   
  • Z成为z
  •   
  • URL成为URL
  •   
     

我们提供了Introspector.decapitalize方法,该方法实现了此转换规则。


应该将什么传递给PropertyUtils.getNestedProperty()作为第二个参数,以使其处理像lSASPro这样的字段名称?


建议

Here使用类似"ClassName.lSASPro"的名称作为第二个参数(字段名称),但这不适用于具有此类名称的第一级字段(即,它将无效)对于lSASPro类中的Test字段,像这样:PropertyUtils.getNestedProperty(Test, lSASPro),因为我们不能通过"Test.lSASPro"作为第二个参数,否则会抱怨Unknown property Test。 lSASPro on class 'Test'

0 个答案:

没有答案