0

我有一个产品类:

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 作为变量名时,它工作正常。有什么解决方法吗?

4

2 回答 2

2

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

JavaBeans 规范的第 8.8 节中:

Java 程序员习惯于让普通标识符以小写字母开头。审稿人的积极意见使我们相信我们应该遵循同样的属性和事件名称的常规规则。

因此,当我们从现有 Java 名称的中间提取属性或事件名称时,我们通常将第一个字符转换为小写。然而,为了支持偶尔使用所有大写名称,我们检查名称的前两个字符是否都是大写的,如果是,则不处理。例如,“FooBah”变成“fooBah”,“Z”变成“z”,“URL”变成“URL”</p>

我们提供了一个方法 Introspector.decapitalize 来实现这个转换规则

也就是说,将您的代码更改为此将修复它:

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

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

Introspector.decapitalize("StbFlag")

结果将返回"stbFlag"

于 2013-04-05T10:29:21.207 回答
0
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
}
}

写这段代码 anwser 来了

于 2013-04-05T10:04:13.013 回答