将一个@Viewscoped托管bean的值传递给另一个@Viewscoped托管bean(pass a value from one @Viewscoped managed bean to anot

编程入门 行业动态 更新时间:2024-10-08 14:38:24
将一个@Viewscoped托管bean的值传递给另一个@Viewscoped托管bean(pass a value from one @Viewscoped managed bean to another @Viewscoped managed bean)

我有一个托管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 Setters

So 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 setters

But 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

本文发布于:2023-08-07 11:16:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1464147.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:bean   Viewscoped   managed   pass

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!