2012-11-10 8 views
12

Schnelle Frage. Dies ist mir bei der Arbeit mit SelectOneMenu noch nicht passiert. Das ist mein Code.p: selectOneMenu setzt keinen Wert in Bean

<h:outputLabel for="listaRegiones" value="Región: " /> 
<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true"> 
    <f:selectItems value="#{nuevaProvincia.regiones}" /> 
</p:selectOneMenu> 
<p:message for="listaRegiones" /> 

Und das ist meine Backbohne.

@ManagedBean(name="nuevaProvincia") 
@ViewScoped 
public class nuevaProvincia implements Serializable { 

    public static final long serialVersionUID = 1L; 

    public nuevaProvincia() throws DAOException { 
     this.provincia = new Provincia(); 
     this.regiones = new ArrayList<SelectItem>(); 
     ArrayList<Region> regs = new ArrayList<Region>(); 
     try 
     { 
      regs = Region.obtenerRegiones(); 
     } 
     catch(DAOException e) 
     { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage())); 
     } 
     if(regs.size()>0) 
     { 
      for(Region r : regs) 
      { 
       SelectItem item = new SelectItem(r.getCodigo(), r.getNombre()); 
       regiones.add(item); 
      } 
      this.regionSelect = regs.get(0).getCodigo(); 
     } 
     else 
      this.regionSelect = ""; 
    } 

    public void verificaProvincia() throws DAOException { 
     provincia.getRegion().setCodigo(regionSelect); 
     try 
     { 
      if(this.provincia.estaCreado()) 
       FacesContext.getCurrentInstance().addMessage("frmIngProvincia:provCodigo", new FacesMessage(FacesMessage.SEVERITY_WARN, "El código de provincia ingresado ya existe.", "El código de provincia ingresado ya existe.")); 
      else 
       FacesContext.getCurrentInstance().addMessage("frmIngProvincia:provCodigo", new FacesMessage(FacesMessage.SEVERITY_INFO, "El código de provincia ingresado no existe.", "El código de provincia ingresado no existe.")); 
     } 
     catch(DAOException e) 
     { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage())); 
     } 
    } 

    public void insertaProvincia() throws DAOException { 
     try 
     { 
      provincia.getRegion().setCodigo(regionSelect); 
      provincia.guardar(); 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Provincia ingresada con éxito", "Provincia ingresada con éxito")); 
     } 
     catch(DAOException e) 
     { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage())); 
      throw e; 
     } 
    } 

    //Getters and setters for everything   

    //Privados 
    private Provincia provincia; 
    private String regionSelect; 
    private List<SelectItem> regiones; 
} 

Das Problem ist wie folgt: wenn ich den Wert meiner selectonemenu ändern, wird der Wert in der Backing Bean nicht gesetzt ist (obwohl ich für regionSelect einen Setter tun haben). Warum würde das passieren?

+0

Wenn Ihre Zeile SelectItem item = new SelectItem (r.getCodigo(), r.getNombre()); Wenn Sie etwas anderes als String als ItemValue eingeben, erhalten Sie einen Fehler mit einem ungültigen Wert (Sie können versuchen, zu verwenden, um festzustellen, ob etwas schief geht) –

+0

Beide Werte in SelectItem sind Zeichenfolgen und '' sagt mir nichts Neues. –

+0

Haben Sie andere Felder in diesem Formular? Wenn ja, werden andere Felder aktualisiert? –

Antwort

21

Ich fand den Fehler und es war ... ziemlich seltsam und umständlich. Ich fügte die folgende Zeile innerhalb des SelectOneMenu hinzu:

<p:ajax event="change" update="@this" /> 

und jetzt funktioniert es ganz gut.

+1

Hervorragend, ich benutze immer noch RichFaces, daher denke ich, dass es einige Unterschiede gibt! –

+0

Es ist möglich, dass beide Verhaltensweisen sehr unterschiedlich sind! –

+3

Dies ist das erwartete Verhalten. In Ihrem Beispiel wird der Wert 'selectOneMenu' beim Senden von Formularen festgelegt. Wenn Sie es mit Ajax einstellen möchten, müssen Sie es angeben. Bitte markieren Sie Ihren Beitrag als Antwort. –

0
<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true"> 
    <f:selectItems value="#{nuevaProvincia.regiones}" /> 
</p:selectOneMenu> 

sollte

<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true"> 
    <f:selectItems value="#{nuevaProvincia.regiones}" var="region" 
     itemValue = "#{region}"/> 
</p:selectOneMenu> 

sein Das ist, warum Sie den Ajax-Aufruf haben, müssen aktualisiert werden, wenn eine Änderung gibt. Sie legen niemals den Wert fest.

+0

Wird 'var =" region "itemValue =" # {region} "' wurde das in Frage gestellt? –

-1

Ich entdeckte, als ich dieses Problem hatte, war es wegen der @ViewScoped. Mit SessionScoped funktioniert stattdessen gut.

Eine interessante Sache ist, dass es in einem anderen Projekt mit ViewScoped funktionierte. Ich kann es nicht erklären.

+1

Sie haben wahrscheinlich die falsche Kombination von @ ViewScoped und @ @ Named/@ ManagedBean Annotation verwendet. Wenn Sie das falsche @ SessionScoped genommen hätten, wäre es nicht gelungen, ... – Kukeltje