短版 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