【问题标题】:Apache Digester: NoSuchMethodException: no such accesible methodApache Digester:NoSuchMethodException:没有这样的可访问方法
【发布时间】:2014-08-08 12:28:07
【问题描述】:

我对 Apache Digester 有疑问,因为它在 当前对象 上调用 set 方法,而不是在对应于父标记的 对象 .结果是 NoSuchMethodException。

Note: I'm reusing the Digester object due to performance problems, but I'm calling clear() method before each parse.

这是我的代码:(在 Header 对象上调用 setHeader 方法,而不是 Message 对象)。

XML:

<message>
    <header id_message="2014871" date="07/08/2014 21:56:41" />
    <body>
        ...
    </body>
</message>

以及创建消化器的代码:

digesterSOBB = new Digester();
digesterSOBB.setValidating(true);
digesterSOBB.setSchema(XMLParser.class.getResource(dtdUrlSOBB).getFile());
digesterSOBB.register("message", XMLParser.class.getResource(dtdUrlSOBB));
digesterSOBB.setErrorHandler(new XMLDtdValidationErrorHandler());

//Message
digesterSOBB.addObjectCreate("message", "com.company.utils.xmlparser.beans.sosc.Message");
digesterSOBB.addSetProperties("message");

//Header-I
digesterSOBB.addObjectCreate("message/header", "com.company.utils.xmlparser.beans.sosc.Header"); 
digesterSOBB.addSetProperties("message/header");
digesterSOBB.addSetNext("message/header", "setHeader", "com.company.utils.xmlparser.beans.sosc.Header");

它工作正常,但是当它处理一些 xml 时,它会尝试在 Header 对象中调用 setHeader 方法:

[8/7/14 5:22:00:322 CEST] 00000061 Digester      E org.apache.commons.logging.impl.Jdk14Logger error End event threw exception
java.lang.NoSuchMethodException: No such accessible method: setHeader() on object: com.company.utils.xmlparser.Header
at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:278)
at org.apache.commons.digester.SetNextRule.end(SetNextRule.java:217)
at org.apache.commons.digester.Rule.end(Rule.java:253)
at org.apache.commons.digester.Digester.endElement(Digester.java:1332)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
...

我查看了javadoc(http://commons.apache.org/proper/commons-digester/commons-digester-2.0/docs/api/),代码看起来还可以(第二个参数是调用父元素的方法名):

public void addSetNext(String pattern,
                       String methodName,
                       String paramType)
Add a "set next" rule for the specified parameters.
Parameters:
pattern - Element matching pattern
methodName - Method name to call on the parent element
paramType - Java class name of the expected parameter type (if you wish to use a primitive type, specify the corresonding Java wrapper class instead, such as java.lang.Boolean for a boolean parameter)

【问题讨论】:

  • 堆栈跟踪中提到了org.company.utils.xmlparser.Header,但您的 digister 配置中提到了 "com.company.utils.xmlparser.beans.sosc.Header"。是不是搞错了?
  • 这是我的错,我已经编辑并更正了问题。

标签: java xml parsing xml-parsing apache-commons-digester


【解决方案1】:

我没有使用过这个库,但是查看手册,它是基于堆栈的 - 引用可能位于子级 (Header) 下的父级 (Message) 时是否存在排序问题,较新的对象位于顶部堆栈的?

FAQ 中有一些关于此的信息: http://wiki.apache.org/commons/Digester/FAQ

请参阅 -> 如何让 CallMethodRule 在 SetNextRule 之前触发? 建议的示例序列在哪里:

digester.addObjectCreate("parent", Parent.class);
digester.addObjectCreate("parent/child", Child.class);
digester.addSetNext("parent/child", "addChild");
digester.addCallMethod("parent/child", "setName", 1);
digester.addCallParam("parent/child/name", 0);

希望这会有所帮助。

【讨论】:

  • 非常感谢,但这应该不是问题,因为我正在使用 SetPropertiesRule,最后它说:“请注意,使用时不会出现此问题 SetPropertiesRule。当遇到匹配的开始标记时,此规则会完成所有工作(因为它只需要开始标记上都存在的属性),因此不会遇到适用于“结束”的“反向调用”顺序规则的方法。” :(。
  • 无论如何我要查看代码,因为我使用 addCallMethod 来解析内部标签。可能是这导致了失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2015-08-01
  • 1970-01-01
  • 2016-02-26
  • 2019-01-11
  • 2017-10-02
相关资源
最近更新 更多