【问题标题】:java.lang.NoSuchMethodException: Bean has no property namedjava.lang.NoSuchMethodException:Bean 没有名为的属性
【发布时间】:2013-09-13 11:00:16
【问题描述】:

我的 XML 和 Bean 与属性“CostCenter”完美匹配,但仍然有这个问题。请帮助解决这个问题。

例外:

Sep 13, 2013 4:25:23 PM org.apache.commons.digester3.Digester endElement
SEVERE: End event threw exception
java.lang.NoSuchMethodException: Bean has no property named CostCenter
    at org.apache.commons.digester3.BeanPropertySetterRule.end(BeanPropertySetterRule.java:206)
    at org.apache.commons.digester3.Digester.endElement(Digester.java:1097)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.apache.commons.digester3.Digester.parse(Digester.java:1588)
    at org.apache.commons.digester3.Digester.parse(Digester.java:1557)
    at ecnet.yes.po.digester.DigestPO.digest(DigestPO.java:80)
    at ecnet.yes.po.digester.DigestPO.main(DigestPO.java:16)
Sep 13, 2013 4:25:23 PM org.apache.commons.digester3.Digester parse
SEVERE: An error occurred while parsing XML from 'file:/D:/workspace/Digester/src/ecnet/yes/po/digester/YES_PO.xml', see nested exceptions

DigestPO.java

    Digester digester = new Digester();
    //Push the current object onto the stack
    digester.push(this);
    digester.addSetProperties("ECnetPO");
    //Creates a new instance of the YESBarePO class
    digester.addObjectCreate("ECnetPO/Header", YESBarePO.class );

    //Uses setName method of the YESBarePO instance
    //Uses tag name as the property name
    digester.addBeanPropertySetter("ECnetPO/Header/PONumber","PONumber");
    digester.addBeanPropertySetter("ECnetPO/Header/CostCenter","CostCenter");

xml:

<ECnetPO>
    <Header>
        <PONumber>PONUMB0116</PONumber>
                <CostCenter>Cost Center 20</CostCenter>
        </Header>

    <Header>
        <PONumber>PONUMB0116</PONumber>
                <CostCenter>Cost Center 20</CostCenter>
        </Header>
</ECnetPO>

YESBarePO.java

private String  PONumber;
private String  CostCenter;
public String getPONumber()
{
    return PONumber;
}


public void setPONumber(String pONumber)
{
    PONumber = pONumber;
}
public String getCostCenter()
{
    return CostCenter;
}


public void setCostCenter(String costCenter)
{
    CostCenter = costCenter;
}

【问题讨论】:

    标签: java apache-commons-digester


    【解决方案1】:

    只是一个猜测,但是如果将实例变量 YESBarePO.CostCenter 重命名为 YESBarePO.costCenter 会有所不同吗?例如,与 .NET 不同的是,标准 Java 习惯用法是使用 lowerCamelCase 作为实例变量,而我的经验表明,某些 bean 映射器需要遵守此约定才能工作。

    【讨论】:

    • 我认为你的 xml 文件有问题,你能发布完整的 xml 文件吗?泰。
    • @sunleo 没问题,希望对您有所帮助。您可能需要更新对addBeanPropertySetter 的调用以引用“costCenter”。
    • @早淘宝谢谢你的帮助。
    • @ATG 感谢您的帮助。你是对的。
    • @sunleo 不客气!对于它的价值,我认为您没有观察到与PONumber 相同的问题的原因是,当变量名的第二个字符为大写时,bean 映射器通常会更宽松一些。这是因为,就像您的情况一样,它通常表示许多开发人员喜欢用大写字母编写的首字母缩写词。例如,考虑一个名为 httpVersion 的字段,而不是 HTTPVersion。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2011-10-16
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多