Доступ к атрибутам составного компонента JSF2 в вспомогательном компоненте - PullRequest
6 голосов
/ 20 февраля 2012

Я занимаюсь разработкой приложения 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.

1 Ответ

5 голосов
/ 20 февраля 2012

Я предполагаю, что конструктор слишком рано для ссылки на эти атрибуты.

JSF сначала создаст экземпляр компонента поддержки, а затем в какой-то момент даст ему ссылку на его атрибуты. В методе, который вызывается позже, например, в методе кодирования, вы должны иметь к ним доступ.

...