2016-04-07 21 views
0

Bu kodda, ödeme yöntemini ve parsel numarasını ayarlamak için iki ajax çağrımız var. İlk çağrı fasulyeyi mükemmel şekilde ayarlar. Ama ikinci değil. Konvertörü herhangi bir sorun olmadan çağırır, ancak setter asla çağrılmaz. Yani cartView.paymentParcel değişken her zaman boş.Primefaces p: ajax + p: selectOneButton bean setter'ı çağırmıyor

<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 Kodu

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

=== Güncelleme === Ben ap koymak

Bir doğrulama sorunu fark ajax isteği analiz ettikten sonra, ve whats happing görmek için mesaj bileşeni ve Aşağıdaki iletiyi aldım:

cartForm:j_idt110:3:parcelButtom: Erro de validação: o valor não é válido 
cartForm:j_idt110:3:parcelButtom: Validation error : invalid value 

Değerin anlamsız olduğunu anlamıyorum Conver hata ayıklanıyor ter: İşte kod:

@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 Tema 2.1.1

Mojarra Sen dönüştürücü içinde yeni bir nesne yaratıyor 2.2.13

+0

Lütfen java kodunuzu da paylaşın. – DiSol

+0

Merhaba DiSol java kodu oldukça basit. Bunun bir doğrulama sorunu olduğundan şüpheleniyorum. Şu anda ajax isteklerini araştırıyorum. –

+0

PaymentParcel sınıfınızda eşit bir yöntem var mı? – DiSol

cevap

1

her seferinde bu nesne, seçili öğeler listesinin bir parçası değildir, bu yüzden bir eşitlik uygulanmalıdır. Daha zarif bir çözüm, dönüştürücüdeki seçili öğelerin listesini taramak ve her seferinde yeni bir nesne oluşturmak yerine doğru olanı döndürmektir.

İlgili konular