在页面到页面导航期间重建@ConversationScoped bean

时间:2015-11-25 23:25:33

标签: jsf jsf-2 navigation cdi conversation-scope

当我从一个页面切换到另一个页面时,我发现了一个奇怪的行为。

我正在使用CDI,Jsf 2.2 API 2.2.8,Omnifaces 2.2,Primefaces 5.2,wildfly 8.2。

大多数控制器和页面按预期工作,但是当我访问页面时,其中一些调用方法@PostConstruct,它启动对话,然后,当我离开页面时,再次调用@PostConstruct。我意识到page.xhtml中的某些东西是原因,所以我开始寻找它。但无论如何这是一种奇怪的行为。

按照我的代码和一些例子:

使用抽象类方法的控制器,如beginconversation()和list()

import javax.inject.Named;
import javax.enterprise.context.ConversationScoped;
@Named
@ConversationScoped
public class PromptConfigurationController extends BaseController<PromptConfiguration> implements Serializable {

    public PromptConfigurationController() {
        super(PromptConfiguration.class);

    }

    @PostConstruct
    public void init() {
        list();
        loadFilters();
    }

}

抽象类

public abstract class BaseController<T extends BaseEntity> {
  public void list() {
        logger.info("list()");

        items = getService().findAll(entityClass);
        item = null;
        beginConversation();
    }

    protected void beginConversation() {
        logger.info("beginConversation()");

        if (conversation != null && conversation.isTransient()) {
            conversation.begin();
            conversation.setTimeout(CONVERSATION_TIMEOUT);
            logger.info("Conversation iniciada: " + conversation.getId());
        }
    }
}

我发现问题和解决方案(当我发现时)的一些xhtml页面是:

错误:

  <f:convertDateTime pattern="#{webChatSearchController.dateHelper.getLocalizedDatePattern()}" />

上面的方法只返回一个模式。

工作

<f:convertDateTime dateStyle="dd/MM/yyyy" pattern="dd/MM/yyyy" />

错误:

<p:commandButton id="commandButton-active" action="#{satisfactionSurveyController.changeQuestionStatus(true)}" update="form-content" binding="#{satisfactionSurveyController.activeButton}" value="#{bundle['common.active.3.message']}">

工作:

<p:commandButton id="commandButton-active" action="#{satisfactionSurveyController.changeQuestionStatus(true)}" update="form-content"  value="#{bundle['common.active.3.message']}" disabled="#{satisfactionSurveyController.disableActiveButton}">

问题只是“绑定”。

错误:

<p:dataTable id="dataTable-group-email" var="emailMonitor" value="#{emailMonitorController.listEmailGroup}" selectionMode="single"   rowKey="#{emailMonitor}" filteredValue="#{emailMonitorController.listEmailGroupFiltered}">

工作:

<p:dataTable id="dataTable-group-email" var="emailMonitor" value="#{emailMonitorController.listEmailGroup}" selectionMode="single"   rowKey="#{emailMonitor}" >

只是删除'filteredValue'就开始工作了。但没有它,我就无法使用过滤器属性。

导航由主要菜单菜单完成,所有页面都是相同的逻辑:

<p:menuitem id="satisfactionSurvey" action="#{satisfactionSurveyController.listPage}" value="#{bundle[satisfactionSurvey.message']}"  ajax="false" immediate="true">
                            <f:param name="nocid" value="true" />
                        </p:menuitem>

和方法:

public String listPage() {        
        return baseViewPath + "/list.xhtml?faces-redirect=true";
    }

0 个答案:

没有答案