2011-07-30 3 views
5

Aşağıdaki destek fasulye var:JSF'ye bir yüz mesajı eklerken eylemlerim gerçekleştirilemiyor mu?

@ViewScoped 
@ManagedBean 
public class WeighFamilyBacking2 implements Serializable { 

private static final long serialVersionUID = 1L; 
private String[] children = new String[] { "Child1", "Child2", "Child3" }; 
private HashMap<String, Integer> newWeights; 

public WeighFamilyBacking2() { 
    newWeights = new HashMap<String, Integer>(); 
    for (String s : getChildren()) 
     newWeights.put(s, new Integer(0)); 
} 

public void distributeWeightsWithoutMessage(ActionEvent event) { 
    for (String s : newWeights.keySet()) { 
     newWeights.put(s, newWeights.get(s) + 1); 
    } 
} 

public void distributeWeights(ActionEvent event) { 
    for (String s : newWeights.keySet()) { 
     newWeights.put(s, newWeights.get(s) + 1); 
    } 

    FacesContext.getCurrentInstance().addMessage(null, 
      new FacesMessage("Succesful", "Weights redistributed.")); 
} 

public HashMap<String, Integer> getNewWeights() { 
    return newWeights; 
} 

public List<String> getChildren() { 
    return Arrays.asList(children); 
} 
} 

... Ve aşağıdaki xhtml sayfa:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html"> 
<h:body> 
    <h:form> 
     <ui:repeat var="child" value="#{weighFamilyBacking2.children}"> 
      <h:outputText value="#{child}" /> 
      <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
      <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
      <h:inputText id="oz" value="#{weighFamilyBacking2.newWeights[child]}" /> 
      <h:inputText id="lbs" 
       value="#{weighFamilyBacking2.newWeights[child]}" /> 
      <br /> 
     </ui:repeat> 

     <h:commandButton 
      actionListener="#{weighFamilyBacking2.distributeWeights}" 
      value="Redistribute" /> 


     <h:commandButton 
      actionListener="#{weighFamilyBacking2.distributeWeightsWithoutMessage}" 
      value="Redistribute Without Message" /> 
    </h:form> 
</h:body> 
</html> 

Bu basit bir tekrarlanabilir test niteliği taşıyor. Mesajsız yeniden dağıtım üzerine tıkladığınızda, işler beklendiği gibi çalışır. Yeniden dağıtım düğmesine tıkladığınızda başarı mesajı görüntülenir, ancak giriş alanları güncellenmez. Ancak, metin çıktı alanı sadece bir kez güncellenir.

Her iki düğmede de anında = true kullanmayı denedim ve bunu etkilemiyor. Bu çok basit bir durum, neden işe yaramadığını anlayamıyorum.

Bunu 2.1.3 dahil Mojarra'nın tüm yeni sürümleriyle denedim.

+0

JSF impl/sürümü nedir? Bu sorun Mojarra 2.1.1 ile yeniden üretilemez. – BalusC

+0

2.1.2 kullanıyorum. Ayrıca zengin yüzeyler 4 kullanıyorum ve primefaces de karışımda. Bunlardan bazılarını çıkarmayı deneyeceğim ve bunun işe yarayıp yaramadığına bakacağım. –

+0

Sadece Mojarra 2.1.2 (FCS 20110610) ile aynı sonuçlar. –

cevap

1

Bu başka bir <ui:repeat> anomalisidir. Tam olarak kök nedenini azaltmadım, bunun zaten JSF guys'a bildirilip bildirilmediğini kontrol edebilirim ve gerekirse rapor edebilirim, ancak <ui:repeat>'u bir <h:dataTable> değiştirdiğimde çalıştığını söyleyebilirim.

<h:dataTable var="child" value="#{weighFamilyBacking2.children}"> 
    <h:column> 
     <h:outputText value="#{child}" /> 
     <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
     <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
     <h:inputText id="oz" value="#{weighFamilyBacking2.newWeights[child]}" /> 
     <h:inputText id="lbs" 
      value="#{weighFamilyBacking2.newWeights[child]}" /> 
    </h:column> 
</h:dataTable> 

Belki <table> sizin için anlam doğru değildir. Bu gerçekten inandırıcı değilse, Tomahawk'in <t:dataList>, RichFaces ' <rich:dataList>, PrimeFaces' <p:dataList> vb. Ile sorunsuz çalışıp çalışmadığını kontrol etmek isteyebilirsiniz.

Güncelleme:issue 2157 olarak bildirdim.

+0

Teşekkür ederim BalusC! En azından delirmediğimi biliyorum. Bir veritabanın büyük olasılıkla iyi çalışır. Bana bildirmek için JSF adamlarıyla bir şey açmamı isterim. Test vakasına yeniden üretilmesi oldukça kolaydır. Bu, sadece yineleme içindeki inputText öğelerini etkilemesi garip. Düşünüyorum belki tekrar içinde inputText öğeleri tanımlamakla ilgili bir şey var mı? –

+0

Evet, benzer bir sorun daha önce invoke eylemi sırasında güncellenen iç içe geçmiş bir 'ui: repeat' onay kutularında yaşadım. Ama hiçbir "FacesMessage" yoktu. Senin parçacık sorununda 'FacesMessage' nedenini merak ediyorum. – BalusC