2015-02-09 65 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

相關問題