2013-04-05 57 views
0

我有一個產品類:NoSuchMethodException在試圖讓嵌套bean屬性

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作爲變量名時,它工作正常。任何解決方法?

+0

它給你'NoSuchMethodexception'嘗試寫這樣的東西'BeanUtils.getNestedProperty(product,「prodClass.getStbFlag」);'可能是這樣的 – 2013-04-05 09:59:46

回答

1

BeanUtils的期待您的字段名稱以小寫字母開頭,因爲它符合JavaBean命名約定。

JavaBeans spec的第8.8節:

的Java程序員習慣有正常的標識符開始 小寫字母。有力的審稿人輸入已經使我們確信,我們 應該遵循這個相同的傳統規則的財產和事件 名稱。

因此,當我們從 現有Java名稱的中間提取屬性或事件名稱時,我們通常會將第一個字符轉換爲較低的 大小寫。但是,爲了支持偶爾使用全部大寫字母的名稱,我們檢查名稱的前兩個字符是否都是大寫字母 ,如果是這樣,請單獨使用。因此,例如,「FooBah」變成「fooBah」 「Z」變爲「Z」,「URL」變成了「網址」

我們提供了一個方法Introspector.decapitalize,將實現該轉換規則

那說,改變你的代碼,這將解決這個問題:

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

如果從一個XML文件中獲取字符串"StbFlag",我會建議使用BeanUtils的使用將其轉換爲正確的格式相同decapitalize方法。

Introspector.decapitalize("StbFlag") 

作爲結果將返回"stbFlag"

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即將

+0

這與OP張貼的代碼完全相同,這是爲了證明什麼? – gordonk 2013-04-05 14:10:35