2015-02-09 63 views
2

短版 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文件,后面的条目只是覆盖较早的文件。

有什么办法强制选择到我的图书馆?

到目前为止,我有以下选择:

  1. 直接把我的渲染成战争的WEB-INF/faces-config.xml
  2. 构建定制的Primefaces jar,并删除该渲染器定义 。
  3. 重命名我的图书馆,并依靠从JSF装载机一些(我可以 极目远眺无证)的行为。
  4. 添加它扩展了标准的一个自定义的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 { 
    ... 
} 

感谢

回答

2

您可以在JAR的faces-config.xml指定通过<ordering>排序。

E.g.如果你想加载你的工具库中的所有其他人之后,那么就这样做:

<ordering> 
    <after> 
     <others /> 
    </after> 
</ordering> 

如果要强制明确排序,然后勾上明确PrimeFaces,其必须在<name>primefaces</name>faces-config.xml

<ordering> 
    <after> 
     <name>primefaces</name> 
    </after> 
</ordering> 
+0

只适用于'faces-config.xml'方法,但以简单的方式解决了我的问题,所以非常感谢。我猜这个注解被规范的第11.5.1节作为“应用程序配置资源中的一个条目和注释_之间的_conflict”来破坏,这对我来说似乎是错误的,因为我会说在一个排序中没有冲突,但我想这是一个解释问题。 – Barney 2015-02-10 09:17:35

相关问题