使用FullAjaxExceptionHandler时未插入h:outputStylesheet

时间:2018-11-20 19:31:17

标签: jsf omnifaces

我正在使用OmniFaces FullAjaxExceptionHandler来显示错误页面。错误页面可以正确显示,但是这些页面的样式存在问题。

我的应用程序使用的模板在<h:body>部分中加载了CSS类,如下所示。 <h:outputStylesheet name="css/theme.css" library="theme" />

我发现h:body not rerendered when using FullAjaxExceptionHandler上的BalusC答案对于更改正文标签很有帮助。但是我很困惑为什么FullAjaxExceptionHandler不能代替单个<head>元素的孩子。似乎所有<h:outputStylesheet>元素都被忽略,无论它们位于何处。

1 个答案:

答案 0 :(得分:1)

我知道这是一个很老的问题,但我最近才遇到它,直到 2021 年 5 月 15 日才刚刚解决。

标题是这个问题在 OmniFaces >= 3.11.1 的版本中得到解决。在撰写本文时,OmniFaces 3.11.1 是一个 Maven 快照构建。

该问题是由于 JSF 2.3 的 Mojarra 实现试图避免将 HTML 链接输出到 CSS 资源两次造成的。它通过记录它认为已输出的所有资源的列表来做到这一点。然后,如果进一步尝试输出相同的资源,则第二次和进一步的尝试将被忽略。该列表存储在名为“/javax.faces.resource”的 JSF 属性中,该属性是 ResourceHandler.RESOURCE_IDENTIFIER 的值。

在 Primefaces/JSF 呈现对由 Primefaces 组件生成的 Ajax 请求的响应的情况下,呈现会替换整个页面,包括已经呈现的资源。在这种情况下,OmniFaces 的 FullAjaxExceptionHandler 应该清除“/javax.faces.resource”属性,以允许重新渲染资源。

在 OmniFaces 案例 627 & 630

中跟踪并解决了问题