1

我使用 Richfaces 3.3.3.Final 和 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 块。

谢谢你的帮助。

4

1 回答 1

1

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

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

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

于 2012-04-21T12:26:23.077 回答