【问题标题】:PropertyUtils.getProperty fails when trying to get a simple property value尝试获取简单属性值时,PropertyUtils.getProperty 失败
【发布时间】:2011-11-23 16:06:44
【问题描述】:

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

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

【问题讨论】:

  • 什么是PropertyUtils?它不是标准的 Java 类。
  • 调用 PropertyUtils.getProperty(p, "ADate");工作正常:o
  • 它是来自 common-beanutils 的 org.apache.commons.beanutils.PropertyUtils
  • @Jesper 不是标准,而是 Apache Commons 的一部分,事实上的标准。

标签: java apache-commons-beanutils


【解决方案1】:

我不明白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

【讨论】:

  • 你是对的,这只是一个拼写错误,我编辑了问题:)
  • @Fred +1 感谢您的信任,但这并不完全是一个错误。这是java.beans.Introspector 的行为,在Java Beans Specification 之后,因为无论bean 中的属性如何命名,用于访问属性的名称都派生自getter/setter 方法。标准规定如果前两个字母为大写,则第一个字母将转换为小写except。在这种情况下,名称保持不变。
  • @Fred 抱歉让大家大惊小怪,但你知道,当duty calls...
【解决方案2】:

看看这个bug report

Java Bean 规范在“8.8 大小写 推断名称”,当第一个字符转换为 小写除非前两个字符都是大写然后 属性名称“未更改”。

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

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

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

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

【讨论】:

  • 我以为我在 commons-beanutils 中发现了一个 BUG,它是命名约定(在我的例子中,我的属性被称为“xPos”)
【解决方案3】:

您可能需要使用:

PropertyUtils.getProperty(p, "ADate");

其中 A 大写

【讨论】:

  • getter 和 setter link
【解决方案4】:

试试

PropertyUtils.getProperty(p, "ADate");

而不是

PropertyUtils.getProperty(p, "aDate");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多