JSF 2.0:@ResourceDependency在以编程方式添加UIComponent时不起作用

时间:2010-11-29 09:57:36

标签: java jsf jsf-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包含在页面中,myComponent2.css没有。

功能?错误?配置问题?

有没有以编程方式添加资源以解决这个问题?

运行Mojarra 2.0.2

1 个答案:

答案 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帖子,它描述了如何“安全”地做到这一点。