@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
包含在页面中,myComponent2.css
没有。
功能?错误?配置问题?
有没有以编程方式添加资源以解决这个问题?
运行Mojarra 2.0.2
答案 0 :(得分:6)
我知道这是在10个月前被问到的,但我一直面临同样的问题。这里的资源问题是由于您使用“new”来实例化您的子组件。相反,你应该使用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上测试过。它也不起作用。我在Mojarra问题跟踪器中添加了issue
再次更新:Mojarra的人们告诉我,encodeBegin不是尝试添加组件的地方。他们向我指出了这个blog帖子,它描述了如何“安全”地做到这一点。