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

nad*_*ani 5 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(){}
}
Run Code Online (Sandbox Code Playgroud)

和一个来电类一样

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

第一次PropertyUtils.getProperty调用工作正常,而第二个会throwNoSuchMethodExeption.

我想知道我是否遗漏了一些愚蠢的东西,或者它真的是一个bug :)

Xav*_*ica 6

看看这个错误报告

Java Bean规范在"8.8推断名称的大写"一节中说明,当第一个字符转换为小写时,除非前两个字符都是大写,则属性名称是"未更改".

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

因此,如果您有一个名为"getADate"的getter方法,则会将其转换为属性名称"ADate"而不是"aDate".

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

  • 使用属性名称"ADate"代替或
  • 将方法名称更改为"getaDate""setaDate"


Fre*_*red 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

链接到PropertyUtils 方法

为了解决您的问题,有两种解决方案:

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

正如哈维所说,这是一个已报告的错误

  • @Fred +1 感谢您的认可,但这并不完全是一个错误。这是 [java.beans.Introspector](http://java.sun.com/j2se/1.5.0/docs/api/java/beans/Introspector.html) 的行为,遵循 [Java Beans 规范](http ://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html),因此用于访问属性的名称都是从 getter/setter 方法派生出来的,无论属性中的命名方式如何豆。该标准规定,第一个字母将被转换为小写**除非**如果前两个字母是大写的。在这种情况下,名称保持不变。 (2认同)