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

Tuu*_*nen 2 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 {

    // ...

}
Run Code Online (Sandbox Code Playgroud)

myComponent1.css被包含在页面中,myComponent2.css没有.

特征?错误?配置问题?

它有程序化的方式来添加资源可能解决这个问题吗?

运行Mojarra 2.0.2

Rob*_*b V 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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的encodeBegin方法中,您将能够看到实际添加了Resources(例如,将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
Run Code Online (Sandbox Code Playgroud)

遗憾的是,它们仍然永远不会被渲染,就好像组件具有与最终渲染的页面不同的视图根.在报告任何错误之前,我仍然在进一步研究这个问题.我目前正在运行mojarra 2.0.6,我可以在2.2上试一试,看看问题是否已经解决.

更新:在Mojarra 2.1.3和2.2-SNAPSHOT上测试.它也不起作用.我在Mojarra Issue Tracker中添加了一个问题

再次更新: Mojarra的人告诉我,encodeBegin不是尝试添加组件的地方.他们向我指出了这篇博客文章,其中描述了如何"安全"地做到这一点.