Dears, at this code we have two ajax calls to set the payment method and the parcels number. The first call sets the bean perfectly. But the second not. It call the converter without any problem but the setter never is called. So the variable cartView.paymentParcel is always null.
<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>
Bean Code
@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;
}
}
=== Update ===
After analysing the ajax request I noticed an validation issue, and I put a p:message component to see whats happing and I get the following 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
I don't understand why the value is invalid I debuged the converter: Here the code:
@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 "";
}
}
}
Glassfish 4.1
Primefaces 5.3.0 + Modena Theme 2.1.1
Mojarra 2.2.13