Richfaces:NoSuchFieldElementException用于HTML标记的AjaxChildrenRenderer

时间:2012-04-21 08:47:59

标签: jsf richfaces facelets

我使用richfaces 3.3.3.Final with Seam和facelet。

我在我的应用程序上插入了一个分析器,我有一个奇怪的行为。 当我记录应用程序抛出的所有异常时,我在10分钟内有超过10 000个NoSuchFieldElementException。

经过多次搜索,我发现了问题:

当我通过a4j:support启动ajax请求时,AjaxChildrenRenderer会在这些行(199-202)中抛出NoSuchFieldElementException:

String componentType = (String) component.getClass().getField("COMPONENT_TYPE").get(null);
result = _specialComponentTypes.contains(componentType);

组件变量是UIInstructions,它没有“COMPONENT_TYPE”字段。所以,例外是正常的。 对于我的页面中包含的每个html块,抛出此异常。例如:

<h2>Test</h2>
<span></span>

当我使用html标记重新修改块时,会抛出异常。 我有非常复杂的页面,所以我得到了很多这样的例外。

如何避免此异常?可能是一个解析器选项,以避免在此类中使用html块。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

作为临时解决方案,您可以修改源代码以添加instanceof检查,该检查应跳过该块,然后使用您的webapp发送修改后的源代码。将它作为一个具有相同包/类名的单个类在Web项目本身中运行(javadoc-document it恰当),它总是优先于JAR中的一个类加载,或者作为修改和重建的JAR文件。

if (!(component instanceof UIInstructions)) {
    String componentType = (String) component.getClass().getField("COMPONENT_TYPE").get(null);
    result = _specialComponentTypes.contains(componentType);
}

作为一个持久的解决方案,您应该将其作为性能问题报告给RichFaces人员,以便他们修复并发布新的更新,但我认为他们不会优先考虑3.3.x更新。即它可能需要比你预期的更长的时间。