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

Custom FaceletFactory in JSF 2.2 / Alternatives for virtual host facelets

自 Mojarra/JSF 2.2。无法再使用 web.xml 上下文参数提供自定义 FaceletFactory

<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 returns 与 http://www.otherdomain.com/index.xhtml 不同的内容。使用自定义资源解析器,其背后的机制并不是什么大问题。这样做的真正问题是,jsf 仅根据其请求的 uri 缓存 facelets,该 uri 不包含主机名(在两种情况下均为 "/index.xhtml")。我通过在我的自定义 FaceletFactory: uri = "/" + getCleanHostName() + "://" + uri; 中简单地添加主机名来解决这个问题。使用 JSF 2.2,这似乎不再可能了。有没有其他方法可以在 JSF 2.2 中存档正确的缓存行为?由于其性能影响,禁用面部缓存不是一个选项。

曾计划根据 issue 611. However, it was cancelled later, because there were abstraction leaks. See also the What's new in JSF 2.2? 在 JSF 规范中对其进行标准化,但尽管 Ed 在问题 611 中提出了请求,但原始状态不再回滚,如下所述:

But when I removed the standardized FaceletFactory, in r11053, I didn't put back the context param. Would you be satisfied if I just put it back and it worked as in 2.1?

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

另一种方法是将其替换为自定义的 ResourceHandler (not ResourceResolver, as that's deprecated in JSF 2.2), along with a custom FaceletCacheFactory(自 JSF 2.1 起标准化),可以通过 faces-config.xml 中的 <factory><facelet-cache-factory> 进行注册。