我有一个托管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
将从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附加到这一行,我得到了这个:
您可以注意到变量selectedSalleOrAc
具有空值,selectedSalleOrAcId
具有字符串值。
所以我将调试器附加到effacerJourDialog方法:
当我将它们传递给对话框时,你可以看到变量selectedSalleOrAc
和selectedSalleOrAcId
,但是在effacerJour()方法中只知道selectedSalleOrAcId
变量。
我该如何解决这个问题?
PS:我的两个托管bean是视图范围
答案 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>