JSF 2.2中的自定义FaceletFactory /虚拟主机facelets的替代方案

时间:2015-08-13 09:52:39

标签: jsf facelets factory jsf-2.2 mojarra

自Mojarra / JSF 2.2以来。使用FaceletFactory上下文参数提供自定义web.xml是不可能的:

<context-param>
        <param-name>com.sun.faces.faceletFactory</param-name>
        <param-value>my.faces.overrides.MyFaceletFactory</param-value>
</context-param>

我的应用程序提供了一些CMS功能,包括基于当前请求的域提供不同页面(facelets)的虚拟主机支持。因此,http://www.domain1.com/index.xhtml会返回与http://www.otherdomain.com/index.xhtml不同的内容。这背后的机制并不是使用自定义资源解析器的大笔交易。这样做的真正问题是,jsf仅基于其请求的uri缓存facelets,该uri不包含主机名(在两种情况下都为"/index.xhtml")。我只是在自定义FaceletFactory uri = "/" + getCleanHostName() + "://" + uri;中添加主机名,解决了这个问题。使用JSF 2.2,这似乎不再可能。有没有其他方法来存档JSF 2.2中正确的缓存行为?由于性能影响,禁用faces缓存不是一种选择。

1 个答案:

答案 0 :(得分:3)

有计划按照issue 611在JSF规范中对其进行标准化。但是,它后来被取消了,因为有抽象泄漏。另见What's new in JSF 2.2?但是,尽管Ed在问题611中提出了如下所述的请求,但原始状态不再回滚:

  

但是当我删除标准化的FaceletFactory时,在r11053中,我没有   放回上下文参数。如果我把它放回去并且它像在2.1中一样工作,你会感到满意吗?

您可能想要创建一个新问题来唤醒它。

替代方法是将其替换为自定义ResourceHandler(不是ResourceResolver,而不是JSF 2.2中的deprecated),以及自定义{{3} (自JSF 2.1起标准化),可以通过<factory><facelet-cache-factory>中的faces-config.xml注册。