将一个@Viewscoped托管bean的值传递给另一个@Viewscoped托管bean

时间:2016-08-19 08:39:43

标签: jsf primefaces

我有一个托管bean myBean1,它有这个方法:

private String selectedSalleOrAc;
private String selectedSalleOrAcId;

public void effacerJourDialog(Object o){

        if(o instanceof Salle){
            this.selectedSalleOrAc = "1";
            this.selectedSalleOrAcId = ((Salle)o).getId() + "";
        }
        if(o instanceof Appareil){
            this.selectedSalleOrAc = "2";
            this.selectedSalleOrAcId = ((Appareil)o).getId() + "";       
        }

        Map<String, Object> options = new HashMap<>();
        options.put("modal", true);
        options.put("resizable", false);
        options.put("closable", true);
        options.put("width", 660);
        options.put("height", 700);
        options.put("closeOnEscape", true);
        options.put("contentWidth", 660);
        options.put("contentHeight", 700);
        // Affichage du dialogue
        Map<String, List<String>> params = new HashMap<>();
        List<String> values = new ArrayList<>();
        values.add(this.selectedSalleOrAcId);
        values.add(this.selectedSalleOrAc);
        params.put("selectedSalleOrAcId", values);
        params.put("selectedSalleOrAc", values);
        RequestContext.getCurrentInstance().openDialog("/planningSalleAppareil/effacerJour", options, params);
    }

 //Getters and Setters

因此方法effacerJourDialog将打开一个对话框,其中传递了两个参数(selectedSalleOrAcIdselectedSalleOrAc)。

<f:metadata>
    <f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
</f:metadata>

<f:metadata>
    <f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>

<ui:define name="menu">
    <p:menuitem onclick="$('#form\\:valider').click();"
                value="#{messages.valider}"
                icon="ui-icon-nouveau"/>

    <p:menuitem action="#{myBean2.retour()}"
                immediate="true"
                value="#{messages.annuler}"
                icon="ui-icon-supprimer" />


</ui:define>

<ui:define name="content">
    <h:form id="form" styleClass="ui-panel-form" >


        <p:growl id="messages" showDetail="true" showSummary="true"/>


        <p:commandButton id="validerEffacerJour"
                         action="#{myBean2.effacerJour}"
                         update="messages"/>

        <p:panel>

            <p:panelGrid>
                <p:row>
                    <p:column>
                        <h:outputLabel id="jour0"
                                       for="jour"
                                       value="#{messages.Jour}" />
                    </p:column>

                    <p:column>

                        <p:selectOneMenu id="jour"
                                         value="#{myBean2.jourAEffacer}"
                                         required="true"
                                         requiredMessage="Jour de la semaine : vous devez indiquer une valeur.">
                            <f:selectItem itemLabel="Selectionnez un jour" itemValue="" />
                            <f:selectItem itemLabel="#{messages.Jour1}" itemValue="1" />
                            <f:selectItem itemLabel="#{messages.Jour2}" itemValue="2" />
                            <f:selectItem itemLabel="#{messages.Jour3}" itemValue="3" />
                            <f:selectItem itemLabel="#{messages.Jour4}" itemValue="4" />
                            <f:selectItem itemLabel="#{messages.Jour5}" itemValue="5" />
                            <f:selectItem itemLabel="#{messages.Jour6}" itemValue="6" />
                            <f:selectItem itemLabel="#{messages.Jour7}" itemValue="7" />
                        </p:selectOneMenu>
                    </p:column>
                </p:row>

            </p:panelGrid>

        </p:panel>

    </h:form>
</ui:define>

然后,命令按钮validerEffacerJour将从effacerJour调用方法myBean2

    private Integer jourAEffacer;

    private String selectedSalleOrAc;
    private String selectedSalleOrAcId;


    public void effacerJour(){

        Object selectedObject = null;

        if(selectedSalleOrAc.equals("1")){
            selectedObject = salleService.trouver(Integer.parseInt(selectedSalleOrAcId));
        }
        else if(selectedSalleOrAc.equals("2")){
            selectedObject = appareilService.trouver(Integer.parseInt(selectedSalleOrAcId));      
        }

        planningService.effacerJour(selectedObject, this.jourAEffacer);
    }

//Getters and setters

但是我在行中得到了NullPointerException:

if(selectedSalleOrAc.equals("1")){

所以我将一个dubugger附加到这一行,我得到了这个:

enter image description here

您可以注意到变量selectedSalleOrAc具有空值,selectedSalleOrAcId具有字符串值。

所以我将调试器附加到effacerJourDialog方法:

enter image description here

当我将它们传递给对话框时,你可以看到变量selectedSalleOrAcselectedSalleOrAcId,但是在effacerJour()方法中只知道selectedSalleOrAcId变量。

我该如何解决这个问题?

PS:我的两个托管bean是视图范围

1 个答案:

答案 0 :(得分:0)

解决方案就是使用:

<f:metadata>
    <f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
    <f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>

而不是:

<f:metadata>
    <f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
</f:metadata>

<f:metadata>
    <f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>