Primefaces p:ajax + p:selectOneButton 不调用 bean setter
Primefaces p:ajax + p:selectOneButton not calling bean setter
亲爱的,在这段代码中,我们有两个 ajax 调用来设置付款方式和包裹编号。第一次调用完美地设置了 bean。但第二个不是。它调用转换器没有任何问题,但 setter 永远不会被调用。所以变量 cartView.paymentParcel 总是空的。
<p:panel id="payMethodPanel" class="Container" header="2.#{msg.payment_method}">
<p:selectOneRadio id="paymentRadio" layout="custom" value="#{cartView.paymentMethod}" converter="paymentConverter">
<p:ajax process="paymentRadio" update="cartForm:payMethodPanel cartForm:summaryPanel" />
<f:selectItems value="#{paymentView.paymentsMethods}" />
</p:selectOneRadio>
<ui:repeat value="#{paymentView.paymentsMethods}" var="paym">
<div class="MarTop10">
<p:radioButton for="cartForm:paymentRadio" itemIndex="#{paymentView.index}" />
<h:outputText value="#{msg[paym.name]} " />
<h:outputFormat value="#{msg.discount_text}" rendered="#{fn:length(paym.parcels) eq 1 and paym.parcels[0].discount gt 0}">
<f:param value="#{paym.parcels[0].discount}" />
</h:outputFormat>
<h:outputText value="#{msg.installment}" rendered="#{fn:length(paym.parcels) gt 1}"/>
<p:selectOneButton id="parcelButtom" value="#{cartView.paymentParcel}" converter="paymentParcelConverter" rendered="#{fn:length(paym.parcels) gt 1 and cartView.paymentMethod eq paym}">
<p:ajax process="parcelButtom" update="parcelButtom cartForm:summaryPanel" />
<f:selectItems value="#{paym.parcels}" var="par" itemValue="#{par}" itemLabel="#{par.parcel}x #{par.interest eq 0 ? msg.without_interest : msg.with_interest}" />
</p:selectOneButton>
</div>
</ui:repeat>
<div class="EmptyBox10"></div>
</p:panel>
豆码
@SessionScoped
@ManagedBean(name = "cartView")
public class CartView implements Serializable {
private PaymentParcel paymentParcel;
public PaymentParcel getPaymentParcel() {
return paymentParcel;
}
public void setPaymentParcel(PaymentParcel paymentParcel) {
this.paymentParcel = paymentParcel;
}
}
===更新===
分析 ajax 请求后,我注意到一个验证问题,我放置了一个 p:message 组件以查看发生了什么,我收到以下消息:
cartForm:j_idt110:3:parcelButtom: Erro de validação: o valor não é válido
cartForm:j_idt110:3:parcelButtom: Validation error : invalid value
我不明白为什么这个值无效我调试了转换器:这里是代码:
@FacesConverter("paymentParcelConverter")
public class PaymentParcelConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
String[] split = value.split(";");
return new PaymentParcel(Long.parseLong(split[0]), Double.parseDouble(split[1]), Double.parseDouble(split[2]));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof PaymentParcel) {
PaymentParcel parcel = (PaymentParcel) value;
return new StringBuilder()
.append(parcel.getParcel()).append(';')
.append(parcel.getDiscount()).append(';')
.append(parcel.getInterest()).toString();
} else {
return "";
}
}
}
玻璃鱼 4.1
Primefaces 5.3.0 + 摩德纳主题 2.1.1
Mojarra 2.2.13
您每次都在转换器中创建一个新对象,但该对象不是 selecte 项列表的一部分,因此应在其中实现一个相等的对象。一个更优雅的解决方案是扫描转换器中 select 项目的列表,并 return 正确的项目,而不是每次都创建新对象。
亲爱的,在这段代码中,我们有两个 ajax 调用来设置付款方式和包裹编号。第一次调用完美地设置了 bean。但第二个不是。它调用转换器没有任何问题,但 setter 永远不会被调用。所以变量 cartView.paymentParcel 总是空的。
<p:panel id="payMethodPanel" class="Container" header="2.#{msg.payment_method}">
<p:selectOneRadio id="paymentRadio" layout="custom" value="#{cartView.paymentMethod}" converter="paymentConverter">
<p:ajax process="paymentRadio" update="cartForm:payMethodPanel cartForm:summaryPanel" />
<f:selectItems value="#{paymentView.paymentsMethods}" />
</p:selectOneRadio>
<ui:repeat value="#{paymentView.paymentsMethods}" var="paym">
<div class="MarTop10">
<p:radioButton for="cartForm:paymentRadio" itemIndex="#{paymentView.index}" />
<h:outputText value="#{msg[paym.name]} " />
<h:outputFormat value="#{msg.discount_text}" rendered="#{fn:length(paym.parcels) eq 1 and paym.parcels[0].discount gt 0}">
<f:param value="#{paym.parcels[0].discount}" />
</h:outputFormat>
<h:outputText value="#{msg.installment}" rendered="#{fn:length(paym.parcels) gt 1}"/>
<p:selectOneButton id="parcelButtom" value="#{cartView.paymentParcel}" converter="paymentParcelConverter" rendered="#{fn:length(paym.parcels) gt 1 and cartView.paymentMethod eq paym}">
<p:ajax process="parcelButtom" update="parcelButtom cartForm:summaryPanel" />
<f:selectItems value="#{paym.parcels}" var="par" itemValue="#{par}" itemLabel="#{par.parcel}x #{par.interest eq 0 ? msg.without_interest : msg.with_interest}" />
</p:selectOneButton>
</div>
</ui:repeat>
<div class="EmptyBox10"></div>
</p:panel>
豆码
@SessionScoped
@ManagedBean(name = "cartView")
public class CartView implements Serializable {
private PaymentParcel paymentParcel;
public PaymentParcel getPaymentParcel() {
return paymentParcel;
}
public void setPaymentParcel(PaymentParcel paymentParcel) {
this.paymentParcel = paymentParcel;
}
}
===更新===
分析 ajax 请求后,我注意到一个验证问题,我放置了一个 p:message 组件以查看发生了什么,我收到以下消息:
cartForm:j_idt110:3:parcelButtom: Erro de validação: o valor não é válido
cartForm:j_idt110:3:parcelButtom: Validation error : invalid value
我不明白为什么这个值无效我调试了转换器:这里是代码:
@FacesConverter("paymentParcelConverter")
public class PaymentParcelConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
String[] split = value.split(";");
return new PaymentParcel(Long.parseLong(split[0]), Double.parseDouble(split[1]), Double.parseDouble(split[2]));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof PaymentParcel) {
PaymentParcel parcel = (PaymentParcel) value;
return new StringBuilder()
.append(parcel.getParcel()).append(';')
.append(parcel.getDiscount()).append(';')
.append(parcel.getInterest()).toString();
} else {
return "";
}
}
}
玻璃鱼 4.1
Primefaces 5.3.0 + 摩德纳主题 2.1.1
Mojarra 2.2.13
您每次都在转换器中创建一个新对象,但该对象不是 selecte 项列表的一部分,因此应在其中实现一个相等的对象。一个更优雅的解决方案是扫描转换器中 select 项目的列表,并 return 正确的项目,而不是每次都创建新对象。