短版 JSF库:两个提供相同的渲染
如果两个JSF库JAR文件既包括同一家庭和类型的定制渲染器,有没有办法从库本身(即不从包含应用程序)指定应该使用哪一个?像分配优先级一样,高级优先级用于低优先级?
加长版:
我使用的一个项目Primefaces并试图覆盖所提供的头部呈现我自己:
<render-kit>
<renderer>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.Head</renderer-type>
<renderer-class>com.example.MyHeadRenderer</renderer-class>
</renderer>
</render-kit>
如果我把那到战争的WEB-INF/faces-config.xml
文件然后它是好的,我的渲染器被使用。
但是,如果我尝试将代码部署为库jar(my-utils.jar)的一部分,并使用在META-INF/faces-config.xml
中定义的渲染器,则使用Primefaces one。这包含完全相同的定义,所以我猜测它取决于它们加载的顺序。事实上,将我的库重命名为“xx-comps.jar”是有效的,所以看起来JSF会按字母顺序从所有jar文件加载faces-config.xml
文件,后面的条目只是覆盖较早的文件。
有什么办法强制选择到我的图书馆?
到目前为止,我有以下选择:
- 直接把我的渲染成战争的
WEB-INF/faces-config.xml
。 - 构建定制的Primefaces jar,并删除该渲染器定义 。
- 重命名我的图书馆,并依靠从JSF装载机一些(我可以 极目远眺无证)的行为。
- 添加它扩展了标准的一个自定义的RenderKit,并引用 从我的战争
WEB-INF/faces-config.xml
。
前三所有工作,但都不太理想,如(1)和(2)要求我的图书馆外面的变化,和(3)只是看起来狡猾的地狱....
四是只是一个想法,因为我从来没有写过渲染包,所以没有意识到所涉及的努力。不知道它是否实用或可行,但比(1)更好,因为至少应用程序只引用单个渲染工具包,并且在添加新渲染器时不需要更新。如果这种方法似乎是一种合理的解决方案,那么很乐意加大研究这种方法的力度
而且,我非常喜欢使用注释,而不是XML:
@FacesRenderer(componentFamily = "javax.faces.Output", rendererType = "javax.faces.Head")
public class MyHeadRenderer extends Renderer {
...
}
感谢
只适用于'faces-config.xml'方法,但以简单的方式解决了我的问题,所以非常感谢。我猜这个注解被规范的第11.5.1节作为“应用程序配置资源中的一个条目和注释_之间的_conflict”来破坏,这对我来说似乎是错误的,因为我会说在一个排序中没有冲突,但我想这是一个解释问题。 – Barney 2015-02-10 09:17:35