2011-07-30 9 views
5

tengo el siguiente bean de respaldo:Cuando agrego un mensaje de rostros en JSF mis acciones no se realizan?

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

... Y la siguiente página XHTML:

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

Este es un simple caso de prueba reproducible. Cuando hace clic en la redistribución sin mensaje, las cosas funcionan como se espera. Cuando hace clic en el botón redistribuir, muestra el mensaje de éxito pero los campos de entrada no se actualizan. Sin embargo, el campo de salida de texto se actualiza solo una vez.

He intentado utilizar immediate = true en ambos botones y eso no afecta a esto. Este es un caso muy simple, no puedo entender por qué no funciona.

He intentado esto con todas las versiones recientes de Mojarra incluyendo 2.1.3.

+0

¿Qué JSF impl/versión? No se puede reproducir este problema con Mojarra 2.1.1. – BalusC

+0

Estoy usando 2.1.2. También estoy usando richfaces 4 y Primefaces también en la mezcla. Trataré de eliminar algo de eso y ver si eso ayuda. –

+0

Los mismos resultados con solo Mojarra 2.1.2 (FCS 20110610). –

Respuesta

1

Esta es otra anomalía <ui:repeat>. Todavía no he identificado la causa exacta para poder verificar si esto ya se informó al JSF guys y, si es necesario, informarlo, pero puedo decir que funciona cuando reemplazo el <ui:repeat> por un <h:dataTable>.

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

Tal vez un <table> no es semánticamente correcto para usted. Si esto es realmente indeseable, es posible que desee comprobar si funciona sin problemas con <t:dataList> de Tomahawk, RichFaces '<rich:dataList>, PrimeFaces' <p:dataList>, etc., cada una de ellas compatible con la representación de los niños sin marcado adicional.

Actualización: Lo indiqué como issue 2157.

+0

Gracias BalusC! Al menos sé que no estoy loco. Una tabla de datos probablemente funcionaría bien aquí. Avíseme si debería abrir algo con los chicos de JSF para informarlo. Es un caso bastante fácil de reproducir para probar. Es extraño que solo afecte a los elementos inputText dentro de la repetición. Estoy pensando que tal vez tiene algo que ver con la identificación de los elementos inputText dentro de la repetición? –

+0

Sí, he tenido un problema similar anteriormente con casillas de verificación en un 'ui: repeat' anidado que se han actualizado durante la acción de invocación. Pero no hubo 'FacesMessage' involucrado. Tengo curiosidad por la causa del 'FacesMessage' en su problema de particulas. – BalusC

Cuestiones relacionadas