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