私のコードでは、次のようにいくつかのタブを持つ PrimeFaces のウィザード コンポーネントがあります。
<h:form id="myForm">
<p:wizard flowListener="#{mrBean.flowControl}" widgetVar="wiz">
<p:tab id="tab1"></p:tab>
<p:tab id="tab2"></p:tab>
<p:tab id="tab3">
<h:selectOneMenu id="couponList" value="#{mrBean.coupon}"
converter="#{codeToCouponConverter}" >
<f:ajax listener="#{mrBean.doSomething}" execute="@this"/>
<f:selectItem noSelectionOption="true" itemLabel="Choose one..." />
<f:selectItems value="#{mrBean.coupons}" var="c"
itemValue="#{c}" itemLabel="#{c.name} - $ #{c.discount}" />
</h:selectOneMenu>
</p:tab>
</p:wizard>
</h:form>
これはマネージド Bean のコードです。
@ManagedBean(name = "mrBean")
@ViewScoped
public class MrBean {
private List<Coupon> coupons;
private Coupon coupon;
public void doSomething() {
System.out.println("DONE");
}
public String flowControl(FlowEvent event) {
...
}
// Getters and Setters
}
タブの 1 に、タグ<h:selectOneMenu>
を含むコンポーネントがあります。<f:ajax>
オプションを選択したときにのみリスナーがトリガーされる理由がわかりませんChoose one...
。リストから他のオプションを選択するmrBean.coupons
と、リスナーはトリガーされません。DONE
つまり、コンソールに印刷されているのを見たことがありません。
*UPDATE***Converter
:問題は次の原因であることが判明しました。
@RequestScoped
@ManagedBean
public class CodeToCouponConverter implements Converter {
@EJB
private MrsBeanInterface mrsBean;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
String couponCode = value;
if (value != null) return mrsBean.getCoupon(couponCode);
else return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null) {
Coupon c = (Coupon) value;
return c.getId();
} else return null;
}
// Getters and Setters
public MrsBeanInterface getMrsBean() {
return mrsBean;
}
public void setMrsBean(MrsBeanInterface mrsBean) {
this.mrsBean = mrsBean;
}
}
次のように変更する<h:selectOneMenu>
と:
<h:selectOneMenu id="couponList" value="#{mrBean.couponCode}" >
<f:ajax listener="#{mrBean.doSomething}" execute="@this"/>
<f:selectItem noSelectionOption="true" itemLabel="Choose one..." />
<f:selectItems value="#{mrBean.coupons}" var="c"
itemValue="#{c.id}" itemLabel="#{c.name} - $ #{c.discount}" />
</h:selectOneMenu>
mrBean.doSomething
関数を次のように更新します。
@EJB
private MrsBeanInterface mrsBean;
private String couponCode;
private Coupon coupon;
public void doSomething() {
this.coupon = mrsBean.getCoupon(couponCode);
System.out.println("DONE");
}
すべてが完璧に機能します。
私が で間違ったことを説明していただければ、非常にありがたいですConverter
。
よろしくお願いします、
ジェームズ・トラン