gpt4 book ai didi

java - Apache 消化器 : NoSuchMethodException: no such accesible method

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:17 28 4
gpt4 key购买 nike

我在使用 Apache Digester 时遇到问题,因为它在当前对象而不是在与父标记对应的对象中调用set 方法。结果是 NoSuchMethodException。

注意:由于性能问题,我正在重用 Digester 对象,但我在每次解析之前调用clear() 方法。

这是我的代码:(它是在 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)

最佳答案

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

常见问题解答中有一些关于此的信息: http://wiki.apache.org/commons/Digester/FAQ

参见 -> 如何在 SetNextRule 之前触发 CallMethodRule?建议的示例序列是:

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);

希望这有帮助。

关于java - Apache 消化器 : NoSuchMethodException: no such accesible method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25203541/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com