Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf Init方法在@Viewscoped bean中被调用两次_Jsf_Jsf 2_Primefaces_Annotations_Postconstruct - Fatal编程技术网

Jsf Init方法在@Viewscoped bean中被调用两次

Jsf Init方法在@Viewscoped bean中被调用两次,jsf,jsf-2,primefaces,annotations,postconstruct,Jsf,Jsf 2,Primefaces,Annotations,Postconstruct,我正在使用Primefaces的明细表组件。我正在用数据库中的值填充它,当用户从SelectOne菜单中选择某个内容时,会触发一个ajax事件(我尝试只放置相关代码,如果缺少某个内容,请提醒我): xhtml: <h:outputText value="Scope :" /> <h:selectOneMenu id="scope" value="#{scheduleView.scope}"> <f:selectIte

我正在使用Primefaces的明细表组件。我正在用数据库中的值填充它,当用户从SelectOne菜单中选择某个内容时,会触发一个ajax事件(我尝试只放置相关代码,如果缺少某个内容,请提醒我):

xhtml:

 <h:outputText value="Scope :" />
 <h:selectOneMenu id="scope" value="#{scheduleView.scope}">                    
   <f:selectItems value="#{lookup.scopeCombo}"/>
   <p:ajax process="scope" update="schedule, scheduleForm, scheduleFormPG" listener="#{scheduleView.changeScopeType()}"/>
 </h:selectOneMenu> 

<p:schedule id="schedule" value="#{scheduleView.model}" editable="true"/>
@ManagedBean
@ViewScoped
public class ScheduleView implements Serializable { 

@PostConstruct
    public void init() {
        System.out.println("Init ");
        scopeChange();                
    } 

    public void scopeChange(String scope){
        System.out.println("scopeChange ");
        model.clear();
        events = (List<Event>) commonServis.bringEverythingByCriteria(Event.class, "scope" , scope);   
        for(int i= 0; i<events.size();i++){
        model.addEvent(new DefaultScheduleEvent(events.get(i).getAd(), events.get(i).getStartDate(),events.get(i).getEndDate()));
    }

    public void changeScopeType() {
    System.out.println("changeScopeType ");
        scopeChange (scope);
}
当用户更改SelectOne菜单中的值时:

changeScopeType
Init
scopeChange
它应该只进入
init
方法一次。但是触发
changeScopeType
函数后,它进入
init
方法,并用不相关的数据填充计划。我认为它可能与
@Postconstruct
注释有关,但我找不到任何相关的解释。有人能理解原因并提供解决方案吗

以下是全文:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:p="http://prime.primefaces.org/ui"
                template="templates/layout.xhtml"
                xmlns:c="http://java.sun.com/jsp/jstl/core">
    <ui:define name="title">#{labels.schedule}</ui:define>
    <ui:define name="content">
        <h:form id="scheduleForm">
            <h:panelGrid id="scheduleFormPG">
                <p:growl id="msgs" />
                <p:dialog modal="true" widgetVar="statusDialog" header="Status" draggable="false">
                    <h:graphicImage value="resources/images/ajax-loader.gif" />
                </p:dialog>
                <p:dialog showEffect="explode" hideEffect="explode" resizable="false"
                      header="warning" widgetVar="confirmationErase" appendToBody="true" modal="true">
                    <h:outputText value="Are you sure?"/>
                    <br/>
                    <p:commandButton  value="Yes" actionListener="#{scheduleView.deleteEvent(AE)}"
                                     update="msgs, scheduleFormPG, schedule, wrapperPanel"
                                     onstart="statusDialog.show(),confirmationErase.hide()"
                                     oncomplete="statusDialog.hide(), eventDialog.hide()" process="@parent, scope" />
                    <p:commandButton value="No" onclick="confirmationErase.hide()" type="button" />
                </p:dialog>                
                <h:outputText value="scope :" />
                <h:selectOneMenu id="scope" value="#{scheduleView.scope}">                    
                    <f:selectItems value="#{lookup.scopeTypeCombo}"/>
                    <p:ajax process="scope" update="schedule, scheduleForm, scheduleFormPG" listener="#{scheduleView.changeScopeType()}"/>
                </h:selectOneMenu>                
             </h:panelGrid>            
            <p:schedule onDateSelectUpdate="wrapperPanel" 
                        onEventSelectUpdate="wrapperPanel" onEventSelectComplete="eventDialog.show()" eventSelectListener="#{scheduleView.onEventSelect}" 
                        onDateSelectComplete="eventDialog.show();"  dateSelectListener="#{scheduleView.onDateSelect}" id="schedule" value="#{scheduleView.model}" editable="true"/>
            <p:dialog id="dialog111" widgetVar="eventDialog" header="Event Information" showEffect="clip" hideEffect="clip">
                <p:panel id="wrapperPanel">                    
                    <h:panelGrid id="eventDetails" columns="2">   
                        <h:outputLabel for="eventName" value="Event Name *: " />
                        <p:inputText id="eventName" value="#{scheduleView.event.title}" required="true"/>
                        <h:outputLabel value="Start Date:" />
                        <p:calendar id="sKalender" value="#{scheduleView.event.startDate}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />  
                        </p:calendar>
                        <h:outputLabel value="End Date:" />
                        <p:calendar id="eKalender" value="#{scheduleView.event.endDate}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />  
                        </p:calendar>
                        <h:outputLabel value="All Day:" />
                        <h:selectBooleanCheckbox id="allDay" value="#{scheduleView.event.allDay}" />
                        <h:outputLabel value="scope: " />
                        <h:selectOneMenu id="scopeChoice" value="#{scheduleView.event.scope}">                    
                            <f:selectItems value="#{lookup.scopeTypeCombo}"/>
                         </h:selectOneMenu>                         
                          <p:commandButton onclick="confirmationErase.show()" oncomplete="eventDialog.hide()" update="wrapperPanel, msgs, schedule" type="reset" value="Delete" />
                        <p:commandButton value="Save" actionListener="#{scheduleView.addEvent(AE)}" process="@parent, scope" update="schedule wrapperPanel msgs scheduleForm" oncomplete="eventDialog.hide();"/>
                    </h:panelGrid>
                </p:panel>
            </p:dialog>
           </h:form>
    </ui:define>
</ui:composition>

#{labels.schedule}


问题在于这行代码:

<p:ajax process="scope" update="schedule, scheduleForm, scheduleFormPG" listener="#{scheduleView.changeScopeType()}"/>
问题解决了。
感谢大家的努力。

您是否在JSTL
或JSF组件的
id
绑定
属性等标记处理程序中的任何位置引用
{scheduleView}
?另请参见此相关问题:谢谢您的评论。它不在JSTL或id或绑定属性中。但它的用法类似于:value=“#{scheduleView.scope}”或actionListener=“#{scheduleView.deleteEvent(AE)}或listener=“#{scheduleView.changeKapsamTipi()或rendered=“#{scheduleView.takvimTuruYillik}”或eventSelectListener=“#{scheduleView.onEventSelect}”在p:commandButton、p:schedule、p:dataTable和h:selectonemenu组件内部。那么,我看不出任何合理的原因。你在使用Spring吗?我记得JSF部分状态保存机制在安装Spring时会以某种方式中断,导致所有视图范围的bean都像请求范围的bean一样。你需要显式强制
javax.faces.PARTIAL_STATE_SAVING
上下文参数设置为
true
。是的,我正在使用Spring。我尝试关闭您提到的部分状态保存,但没有效果。尝试向bean添加
@PreDestroy public void destory(){System.out.println(“why-ow-why”)}
,然后查看它何时被销毁。。。
<p:ajax process="scope" update="schedule, scheduleForm, scheduleFormPG" listener="#{scheduleView.changeScopeType()}"/>
update="schedule"