Динамическое рендеринг ui: include не будет работать, когда ui: repeat используется в включенном лице

Здравствуйте,

Я помещаю ui:include внутри h:panelGroup и рендеринг его динамически, когда это необходимо.

Обычное предположение и теория: ManagedBean, связанный с включенной страницей, не должен инициализироваться, когда ui:include не отображается.

Этого не происходит, когда я использую ui:repeat внутри включенной страницы.

Вот пример повторения проблемы:

page.1.xhtml

<h:body>
    <h:form>
        <p:outputLabel value="#{mBeanOne.beanOnetxt}"/><br/>
    </h:form>

    <h:panelGroup rendered="false" layout="block">
        <ui:include src="page2.xhtml"/>
    </h:panelGroup>
</h:body>

MBeanOne.java

@ManagedBean
@ViewScoped
public class MBeanOne implements Serializable{

    private String beanOnetxt;

    public MBeanOne() {
        System.out.println("MBeanOne - Constructor");
    }

    @PostConstruct
    public void init(){
        beanOnetxt = "This is Managed Bean 1";
        System.out.println("MBeanOne - Postconstruct");
    }
    //SETTERS and GETTERS
}

page2.xhtml

<h:body>
    <h:outputText value="#{mBeanTwo.beanTwotxt}"/><br/>

    <ui:repeat var="var" value="#{mBeanTwo.versionList}">
        <h:outputText value="#{var}"/><br/>
    </ui:repeat>
</h:body>

MBeanTwo.java

@ManagedBean
@ViewScoped
public class MBeanTwo implements Serializable{

    private String beanTwotxt;
    private List<String> versionList;

    public MBeanTwo() {
        System.out.println("MBeanTwo - Constructor");
    }

    @PostConstruct
    public void init(){
        beanTwotxt = "This is Managed Bean 2";

        versionList = new ArrayList<String>();
        versionList.add("Playground");
        versionList.add("Kestrel");
        versionList.add("Merlin");
        versionList.add("Tiger");

        System.out.println("MBeanTwo - Postconstruct");
    }
    //SETTER and GETTER
}

Как вы можете видеть в page1.xhtml, я использую rendered="false" для h:paneGroup, который инкапсулирует ui:include, но все же MBeanTwo получает инициализацию при загрузке page1.xhtml.

Если я удалю ui:repeat из page2.xhtml, то MBeanTwo не будет инициализироваться.

Является ли это ошибкой в ​​JSF, если это возможно?

Используемые и проверенные версии:
Направляющие 3.5
JSF 2.1.13 и 2.2.0-m05

Ответ 1

Часть <ui:include /> не относится к вашему вопросу, это может быть все сделано в одном и том же представлении с одинаковым поведением.

В любом случае, кажется, что тег <ui:repeat /> не проверяет его родительские атрибуты rendered перед выполнением инициализации bean. Однако метод mBeanTwo#getVersionList никогда не оценивается, создается только управляемый bean. Это может привести к замедлению, если вы выполняете доступ к данным при создании своего bean, но никогда не должны нарушать ваше мнение. Я могу воспроизвести проблему в версиях Mojarra 2.1.x, однако они исправили ее для последних несовершеннолетних 2.2.x.

Кажется ошибкой реализации Mojarra, а не ожидаемым поведением.

См. также: