我有一个产品类:

public class Product {

private ProductClass prodClass;

public ProductClass getProdClass() {
    return prodClass;
}

public void setProdClass(ProductClass prodClass) {
    this.prodClass = prodClass;
}
}


还有另一个ProductClass ...

public class ProductClass {

private String StbFlag;

public String getStbFlag() {
    return StbFlag;
}

public void setStbFlag(String stbFlag) {
    StbFlag = stbFlag;
}
}


当我尝试使用BeanUtils.getNestedProperty获取属性时,如下所示。

public class Test {

public static void main(String Args[]) {

    Product product = new Product();
    ProductClass proClass = new ProductClass();
    proClass.setStbFlag("abcd");
    product.setProdClass(proClass);

    try {
        String value = BeanUtils.getNestedProperty(product, "prodClass.StbFlag");
        System.out.println(value);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}


它引发以下异常...

java.lang.NoSuchMethodException: Unknown property 'StbFlag' on class 'class ProductClass'
    at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1313)
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:762)
    at org.apache.commons.beanutils.BeanUtilsBean.getNestedProperty(BeanUtilsBean.java:715)
    at org.apache.commons.beanutils.BeanUtils.getNestedProperty(BeanUtils.java:354)
    at Test.main(Test.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)


可能是什么原因?这只是我用来找出问题的样本。我实际上是将XML映射到Java对象,并且需要根据xml标签将名称保留为StbFlag。

当我使用STBflag或stbFlag作为变量名时,它工作正常。任何解决方法?

最佳答案

BeanUtils期望您的字段名称以小写字母开头,因为它遵循JavaBean命名约定。

JavaBeans spec的8.8节中:


  Java程序员习惯于以普通标识符开头
  小写字母。审稿人的大力投入使我们深信
  对于财产和事件应遵循相同的常规规则
  名称。
  
  因此,当我们从中间位置提取属性或事件名称时
  现有的Java名称,我们通常将第一个字符转换为小写
  案件。但是,为了支持偶尔使用所有大写名称,
  我们检查名称的前两个字符是否均为大写
  如果是这样,那就别管它了。例如,“ FooBah”变为“ fooBah”
  “ Z”变成“ z”“ URL”变成“ URL”
  
  我们提供了Introspector.decapitalize方法来实现此转换规则


也就是说,将您的代码更改为此将解决此问题:

String value = BeanUtils.getNestedProperty(product, "prodClass.stbFlag");


如果要从XML文件中获取字符串"StbFlag",我建议使用与BeanUtils相同的decapitalize方法将其转换为正确的格式。

Introspector.decapitalize("StbFlag")


结果将返回"stbFlag"

07-25 21:08