自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缓存不是一种选择。
答案 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
注册。