尝试获取Nested bean属性时出现NoSuchMethodException



我有一个产品类别:

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规范的8.8节中:

Java程序员习惯于以小写字母。评审员的积极投入使我们相信对于属性和事件,应遵循相同的常规规则姓名。

因此,当我们从现有的Java名称,我们通常将第一个字符转换为小写案例然而,为了支持偶尔使用所有大写名称,我们检查名称的前两个字符是否都是大写如果是这样的话,就别管它了。例如,"FooBah"变成了"FooBah"Z"变成"Z"URL"变成"URL">

我们提供了一种实现这种转换规则的方法Introspector.decapital

也就是说,将你的代码更改为这个将修复它:

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

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

Introspector.decapitalize("StbFlag")

其结果将返回CCD_ 3。

public class ProductClass {
private String StbFlag;
public String getStbFlag() {
    return StbFlag;
}
public void setStbFlag(String stbFlag) {
    this.StbFlag = stbFlag;//error here write this get anwser
}
}

写下这段代码,然后就来了

最新更新