简体   繁体   English

将值从一个@Viewscoped托管bean传递到另一个@Viewscoped托管bean

[英]pass a value from one @Viewscoped managed bean to another @Viewscoped managed bean

I have a managed bean myBean1 which has this method : 我有一个托管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

So the method effacerJourDialog will open a dialog, with two parameters passed to it ( selectedSalleOrAcId and selectedSalleOrAc ). 因此,方法effacerJourDialog将打开一个对话框, 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>

Then the Command Button validerEffacerJour will call the method effacerJour from myBean2 : 然后将命令按钮validerEffacerJour会调用该方法effacerJourmyBean2

    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

But I'm getting a NullPointerException in the line : 但是我在行中得到了NullPointerException:

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

So I attached a dubugger to this line and I got this : 所以我在该行上附加了调试器,得到了:

在此处输入图片说明

As you can notice the variable selectedSalleOrAc has a null value and selectedSalleOrAcId has a String value. 如您所见,变量selectedSalleOrAc具有空值, selectedSalleOrAcId具有字符串值。

So I attached a debugger to the effacerJourDialog method : 因此,我将调试器附加到effacerJourDialog方法:

在此处输入图片说明

As you can see the both variables selectedSalleOrAc and selectedSalleOrAcId when I passed them to the dialog, but the only selectedSalleOrAcId variable is known in the effacerJour() method. 如您所见,当我将变量传递给对话框时,它们都同时包含selectedSalleOrAcselectedSalleOrAcId ,但是唯一的selectedSalleOrAcId变量在effacerJour()方法中是已知的。

How can I solve this ? 我该如何解决?

PS : my two managed beans are view scoped PS:我的两个托管bean的作用域范围

The solution was just to use : 该解决方案仅用于:

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

Instead of : 代替 :

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM