两个JSF库提供相同的渲染器

时间:2015-02-09 04:20:19

标签: jsf jsf-2.2

短版

如果两个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>

如果我将它放入war文件的WEB-INF/faces-config.xml中,那么一切都很好,我的渲染器会被使用。

但是,如果我尝试将我的代码部署为库jar(my-utils.jar)的一部分,并使用META-INF/faces-config.xml中定义的渲染器,则使用Primefaces。这包含完全相同的定义,所以我猜它只取决于它们加载的顺序。实际上,将我的库重命名为“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
  5. 前三个都工作但不理想,因为(1)和(2)需要在我的图书馆外进行更改,而且(3)只是看起来很狡猾...... [/ p>

    第四个只是一个想法,因为我从来没有写过渲染工具包,所以没有意识到所涉及的努力。不知道它是否实用或可行,但它优于(1)因为至少应用程序仅引用单个渲染工具包,并且如果/当添加新渲染器时不需要更新。如果这似乎是一个合理的解决方案,我很乐意投入更多精力研究这种方法。

    另外,我最好更喜欢使用注释而不是XML:

    @FacesRenderer(componentFamily = "javax.faces.Output", rendererType = "javax.faces.Head")
    public class MyHeadRenderer extends Renderer {
      ...
    }
    

    由于

1 个答案:

答案 0 :(得分:3)

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

E.g。如果您希望在所有其他实用程序库之后加载实用程序库,那么只需执行此操作:

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

如果你想强制一个明确的排序,那么专门挂钩PrimeFaces,<name>primefaces</name>中有faces-config.xml

<ordering>
    <after>
        <name>primefaces</name>
    </after>
</ordering>