我知道這是要求10個月之前,但我一直在面臨這個同樣的問題。您的資源問題是由於您使用「新」來實例化您的子組件而造成的。相反,您應該使用context.getApplication().createComponent("MyComponentType")
, 「MyComponentType」作爲您在@FacesComponent註釋中指定的值。應用程序在創建組件時解析註釋,而不是在渲染時解析。使用new
會剝奪應用程序處理註釋的機會。不幸的是,這實際上並沒有解決問題,它應該,但事實並非如此。
如果添加:
UIComponent headFacet = context.getViewRoot().getFacet("javax_faces_location_HEAD");
if (headFacet == null) {
System.out.println("No Head Facet");
} else {
System.out.println("Head Children: " + headFacet.getChildCount());
for (UIComponent c : headFacet.getChildren()) {
System.out.println(c.getRendererType());
System.out.println(c.getAttributes().get("name"));
}
}
您encodeBegin方法,你將能夠看到的資源實際上已經加入(例如加入PrimeFaces的FileUpload作爲一個孩子):
INFO: Head Children: 4
INFO: javax.faces.resource.Stylesheet
INFO: fileupload/fileupload.css
INFO: javax.faces.resource.Script
INFO: jquery/jquery.js
INFO: javax.faces.resource.Script
INFO: core/core.js
INFO: javax.faces.resource.Script
INFO: fileupload/fileupload.js
不幸的是,它們仍然不會呈現,就好像組件具有與它最終呈現的頁面不同的視圖根。在報告任何錯誤之前,我仍在深入研究。我目前正在運行mojarra 2.0.6,我可以在2.2上試一下,看看問題是否得到解決。
更新:在Mojarra 2.1.3和2.2-SNAPSHOT上測試。它也無法工作。我添加了issue到Mojarra問題跟蹤器
再次更新: Mojarra的人告訴我,encodeBegin不是嘗試添加組件的地方。他們向我指出了這個blog的信息,它描述瞭如何「安全地」做到這一點。
我追溯了這一點。看來JSF沒有找到(=搜索)以編程方式添加的組件的註釋,因此它們沒有任何作用。查看JSF/Mojarra代碼,似乎有多種創建組件的途徑。我想通過標記處理程序創建組件的方式不同於編程方法時的註釋查找方式。如果沒有人站出來糾正我的錯誤,我會將此作爲一個問題報告給Mojarra跟蹤器,以供他們仔細檢查。) – 2010-12-01 12:57:18