JSF 2.0: @ResourceDependency не работает при программном добавлении UIComponent - PullRequest
2 голосов
/ 29 ноября 2010
@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 Ответ

6 голосов
/ 19 октября 2011

Я знаю, что об этом спрашивали 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, чтобы увидеть, решена ли проблема.

Обновление: Проверено на Мохарре 2.1.3 и 2.2-SNAPSHOT. Это тоже не работает. Я добавил проблему в систему отслеживания проблем Mojarra

Обновление еще раз: Люди из Мохарры сообщили мне, что encodeBegin - это не то место, где можно пытаться добавлять компоненты. Они указали мне на этот пост blog , в котором описано, как "безопасно" сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...