我有一个产品类:
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获取Property时,如下所示..
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 Object,并且需要根据xml标记将名称保留为StbFlag。
当我使用STBflag或stbFlag作为变量名时,它工作正常。对此有何解决方法?
答案 0 :(得分:1)
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"
作为结果。
答案 1 :(得分: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
}
}
写这段代码答案即将来临