尝试获取简单属性值时,PropertyUtils.getProperty失败

时间:2011-09-23 13:06:04

标签: java apache-commons-beanutils

我对PropertyUtils.getProperty(bean, fieldName)方法有一个奇怪的问题,我得到了java.lang.NoShuchMethodException

假设我们有一个名为pojo的简单java类:

public class Pojo {
    public java.util.Date aDate;
    public java.util.Date theDate;

    public Pojo(){}
}

和调用者类

public class TestPojo{
    public static void main(String[] args){
        Pojo p = new Pojo();
        p.setADate(new Date());
        p.setTheDate(new Date());

        PropertyUtils.getProperty(p, "theDate");
        PropertyUtils.getProperty(p, "aDate");
    }
}

第一个PropertyUtils.getProperty调用正常,第二个调用throw NoSuchMethodExeption

我想知道我是否遗漏了一些愚蠢的东西,或者它确实是一个错误:)

4 个答案:

答案 0 :(得分:6)

看看这个bug report

  

Java Bean规范在“8.8的资本化”一节中说明   推断名称“第一个字符转换为时的名称   小写,除非前两个字符都是大写,然后是   属性名称“未更改”。

为您调整其余部分(斜体):

  

所以当你有一个名为“getADate”的getter方法时,就是这样   翻译成属性名称“ADate”而不是“aDate”

     

因此,要解决您的问题,您有两种选择:

     
      
  • 使用属性名称“ADate”
  •   
  • 将您的方法名称更改为“getaDate”“setaDate”
  •   

答案 1 :(得分:4)

我不明白PropertyUtils.getProperty(p, "TheDate");如何工作,因为该属性的名称不正确。

试试这个:

public class TestPojo{
    public static void main(String[] args){
        Pojo p = new Pojo();
        p.setADate(new Date());
        p.setTheDate(new Date());

        PropertyUtils.getProperty(p, "theDate");
        PropertyUtils.getProperty(p, "aDate");
    }
}

链接到PropertyUtils method

解决您的问题,有两个解决方案:

  • 使用属性名称“ADate”代替
  • 将您的访问者方法名称更改为getaDate()和setaDate(Date dateToSet)

正如哈维所说,这是一个reported bug

答案 2 :(得分:2)

您可能需要使用:

PropertyUtils.getProperty(p, "ADate");

其中A在大写

答案 3 :(得分:1)

尝试

PropertyUtils.getProperty(p, "ADate");

而不是

PropertyUtils.getProperty(p, "aDate");