Я занимаюсь разработкой приложения JSF2 / Primefaces, и у меня возникают проблемы с доступом к атрибутам, определенным в интерфейсе составного компонента в компоненте поддержки этого компонента.
Мой компонент определен следующим образом:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface componentType="testComponent">
<composite:attribute name="text" required="true" type="java.lang.String" />
</composite:interface>
<composite:implementation>
<h:outputText value="Passed text is: #{cc.attrs.text}" />
</composite:implementation>
</html>
Он хранится в файле с именем text.xhtml
, расположенном в каталоге: application/src/main/webapp/resources/my_component
.
Я использую этот компонент на другой странице (которая является элементом композиции Facelets), например так:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:myc="http://java.sun.com/jsf/composite/my_component"
template="./resources/templates/template.xhtml">
<ui:define name="content">
<h:form id="products">
<myc:test id="test" text="A text" />
</h:form>
</ui:define>
</ui:composition>
Класс вспомогательного компонента определяется следующим образом:
package my.application.component;
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@FacesComponent ( value="testComponent" )
public class TestComponent extends UINamingContainer {
Logger log = LoggerFactory.getLogger(TestComponent.class);
public TestComponent() {
log.debug("TestComponent constructor");
log.debug("getAttributes().size(): " + getAttributes().size());
}
}
Сам компонент работает должным образом.Страница использования отображает вывод Passed text is: A text
.Кроме того, выходные данные журнала выводят сообщения журнала из конструктора TestComponent
, поэтому кажется, что определение xml компонента правильно связано с классом TestComponent
.
Теперь проблема заключается в том, чтоМетод getAttributes()
, вызываемый в конструкторе TestComponent
, всегда возвращает карту нулевого размера.Если я правильно понимаю, я смогу получить доступ к атрибуту text
, объявленному в интерфейсе компонента, используя вызов:
getAttributes().get("text");
в классе TestComponent
, но он всегдавозвращает null
, поскольку карта атрибутов пуста.
Я также пытался получить доступ к атрибуту text
с помощью вызова:
String text = FacesContext.getCurrentInstance().getApplication().
evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{cc.attrs.text}", String.class));
, но он также разрешаетна null
.
Что я делаю не так?Любые советы будут высоко оценены, так как я понятия не имею, что попробовать дальше.
/ Tukasz.