我有一个托管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将打开一个对话框,其中传递了两个参数( selectedSalleOrAcId和selectedSalleOrAc )。
<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将从validerEffacerJour调用方法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,我得到了这个:
您可以注意到变量selectedSalleOrAc具有空值, selectedSalleOrAcId具有String值。
所以我将调试器附加到effacerJourDialog方法:
当我将它们传递给对话框时,您可以看到两个变量selectedSalleOrAc和selectedSalleOrAcId ,但是在effacerJour()方法中只知道了唯一的selectedSalleOrAcId变量。
我怎么解决这个问题?
PS:我的两个托管bean都是视图范围
I have a managed bean myBean1 which has this method :
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 SettersSo the method effacerJourDialog will open a dialog, with two parameters passed to it (selectedSalleOrAcId and selectedSalleOrAc).
<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 :
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 settersBut I'm getting a NullPointerException in the line :
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.
So I attached a debugger to the effacerJourDialog method :
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.
How can I solve this ?
PS : my two managed beans are view scoped
最满意答案
解决方案就是使用:
<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>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>更多推荐
selectedSalleOrAc,selectedSalleOrAcId,effacerJour,<p,电脑培训,计算机培训,IT培训"/&g
发布评论