2010-11-29 48 views
2
@ResourceDependency(library = "component/myComponent", name = "myComponent1.css") 
public class MyComponent1 extends UIComponentBase { 

    public void encodeBegin(FacesContext context) throws IOException { 
     MyComponent2 comp2 = new MyComponent2(); 
     getChildren().add(comp2); 
    } 

} 

@ResourceDependency(library = "component/myComponent", name = "myComponent2.css") 
public class MyComponent2 extends UIComponentBase { 

    // ... 

} 

myComponent1.css被納入頁@ResourceDependency不起作用,myComponent2.css沒有。JSF 2.0:添加UIComponent當編程

特徵?錯誤?配置問題?

它有編程方式來增加資源,也許解決這個問題?

運行鑽嘴魚科2.0.2

+0

我追溯了這一點。看來JSF沒有找到(=搜索)以編程方式添加的組件的註釋,因此它們沒有任何作用。查看JSF/Mojarra代碼,似乎有多種創建組件的途徑。我想通過標記處理程序創建組件的方式不同於編程方法時的註釋查找方式。如果沒有人站出來糾正我的錯誤,我會將此作爲一個問題報告給Mojarra跟蹤器,以供他們仔細檢查。) – 2010-12-01 12:57:18

回答

5

我知道這是要求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的信息,它描述瞭如何「安全地」做到這一點。

+0

您在這裏已經明確做得更好。我查了票(不記得自己是否曾經創造過)和博客博客。我同意你的觀點,所需的方法是非常不直觀的,或者,如果你知道整個JSF規範,甚至可能是直覺的。但是,JSF中的許多問題都是不直觀的,所以我猜想我應該預料到這一點。選擇作爲接受的答案,感謝分享10個月後:) – 2011-10-21 20:29:49