Primefaces p:ajax + p:selectOneButton not calling bean sette



Dears,在这段代码中,我们有两个ajax调用来设置付款方式和包裹编号。第一个调用完美地设置了bean。但第二个不是。它调用转换器没有任何问题,但从未调用setter。因此,变量cartView.paymentParsel始终为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代码

@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 "";
        }
    }
}

Glassfish 4.1

Primefaces 5.3.0+莫德纳主题2.1.1

Mojarra 2.2.13

您每次都在转换器中创建一个新对象,但该对象不在selected项列表中,因此应该在其中实现equal。一个更优雅的解决方案是扫描转换器中的selectitems列表并返回正确的对象,而不是每次都创建新对象。