Я не вижу меню, созданного в методе @PostConstruct в компоненте @ViewScoped, когда веб-страница загружается с перенаправлением - PullRequest
0 голосов
/ 27 февраля 2020

Среда:

  • Jboss 5.2
  • Java 7
  • JSF 2.1.2
  • Primefaces 6.2
  • Мохарра (1.2_13-b01-FCS)

Я хочу загрузить меню, сгенерированное в методе @PostConstruct в компоненте ViewScope, но при загрузке веб-страницы меню становится недействительным.

Страница persona.x html загружается с перенаправления с другой веб-страницы, и PersonaBean имеет ViewScope. PersonaBean init () @PostConstruct выполняется, но на веб-странице не загружаются значения.

Специфический c bean-компонент CustomMenuBean (область просмотра) загружен, но CustomMenuBean.menu на веб-странице имеет значение null, но имеет меню в bean-компоненте (когда я останавливаюсь в режиме отладки, CustomMenuBean.menu правильно загружается).

Поэтому я попытался обновить frmMenus с помощью кнопки для целей тестирования, и она хорошо работает после обновления веб-страницы sh со следующим кодом.

<p:commandButton value="update" action="#{personaBean.doNothing}"  process=":frmMenus" update=":frmMenus"/>

Веб-страница persones.x html

...
<p:dataTable id="lstPersones" var="item" value="#{personesBean.items}"...>
    <p:ajax event="rowSelect" listener="#{personesBean.onRowSelect}"/>
...

PersonesBean. java

@ViewScoped
@ManagedBean
public class PersonesBean ...
...
    @Override
    public void onRowSelect(SelectEvent event) {
        ...
        HttpServletRequest origRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        String ctxPath = origRequest.getContextPath();
        FacesContext.getCurrentInstance().getExternalContext().redirect(ctxPath + "\gestio\persona.xhtml");
...

Веб-страница persona.x html

...
<h:form id="frmMenus">
    <div class="layout-menu-container #{usuariPreferenciesBean.menuClass}">
        <div class="nano">
            <div class="nano-content menu-scroll-content">
                <ui:include src="menu_profile.xhtml"/>

                <pu:menu id="mnu_custom" widgetVar="mnu_custom" model="#{customMenuBean.menu}"/>
                <p:separator/>
            </div>
        </div>
    </div>
</h:form>

 <h:form id="frmPersona">
    <!-- person data -->
 </h:form>
 ...

PersonaBean. java

@ViewScoped
@ManagedBean
public class PersonaBean...
...
@ManagedProperty(value = "#{customMenuBean}")
private CustomMenuBean cstmMenuBean; //View scope Bean to store menu

@PostConstruct
public void init() {

    super.init(Persona.class);
    super.setService(service);

    cstmMenuBean.generateMenu(); //create a DefaultMenuModel()

}
...

I не знаю, чего мне не хватает.

1 Ответ

0 голосов
/ 02 марта 2020

Эта ошибка кажется ошибкой, и я не нашел объяснения.

Я просто выполняю скрытую кнопку из javascript в управляемом компоненте @PostConstruct.

Это не так, но это решило проблему с этим патчем.

PersonaBean. java

PrimeFaces.current().executeScript("document.getElementById(\"frmPersona:btnUpdate\").click()");

persona.x html

<p:commandButton id="btnUpdate" value="update" action="#{personaBean.doNothing}" process=":frmMenus" update=":frmMenus" style="display:none"/>

Похоже, ошибка в JSF:

Обновление (De c 2012): это действительно так ошибка в JSF2. Это проблема куриного яйца. Бины с областью видимости хранятся в состоянии просмотра JSF. Таким образом, компоненты видимости доступны только после фазы восстановления. Тем не менее, атрибут привязки выполняется во время фазы представления восстановления, в то время как bean-объекты области видимости еще не доступны. Это вызывает создание нового экземпляра bean-объекта области видимости, который затем заменяется реальным bean-объектом области видимости, который был сохранен в восстановленном состоянии представления JSF.

Сообщается как JSF-проблема 1492 и JSF spe c isssue 787 , которые будут исправлены для JSF 2.2. До тех пор, лучше всего использовать исключительно привязку по запросу bean-объекта bean-объекта или искать альтернативные пути для конкретного функционального требования.

У Balus есть статья , которая решает эту проблему или очень похожий.

...