2012-11-10 9 views
12

簡単な質問。以前はSelectOneMenuを使って作業していました。これは私のコードです。p:selectOneMenuは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" /> 

これは私のバッキングビーンです。 (私はregionSelect用セッターを持っているが)、私は私のselectonemenuで値を変更するたびに、バッキングBeanに値が設定されていない:

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

問題は、次の通りです。なぜこれが起こるのだろうか?

+0

ラインSelectItemアイテム=新しいSelectItem(r.getCodigo()、r.getNombre()); ItemValueとしてString以外のものを指定していると、値が正しくないというエラーが出ます(を試してみてください) –

+0

SelectItemで設定された値はどちらも文字列です。 ''は何も新しいことを教えてくれません。 –

+0

このフォームの他のフィールドはありますか?はいの場合、他のフィールドは更新されますか? –

答えて

21

エラーが見つかりました...それは非常に奇妙で情緒的でした。私はSelectOneMenuの中に次の行を追加しました:

​​3210

今はうまくいきます。

+1

優れている、私はまだRichFacesを使用しているので、いくつかの違いがあると思います! –

+0

両方の動作がかなり異なる可能性があります。 –

+3

これは予期された動作です。あなたの例では、フォームsubmitで 'selectOneMenu'値を設定します。 ajaxで設定する場合は、それを指定する必要があります。あなたの投稿を回答としてマークしてください。 –

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

は、変更があるたびに更新するために、AJAX呼び出しを持っている必要が理由です

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

でなければなりません。値を設定することは決してありません。

+0

'var =" region "itemValue ="#{region} "'は質問されましたか? –

-1

この問題が発生したとき、それは@ViewScopedが原因であることが判明しました。代わりにSessionScopedを使用すると正常に動作しました。

興味深いのは、別のプロジェクトでは、ViewScopedというものがありました。私は説明できません。

+1

'@ ViewScoped'と' @ Named'/'@ ManagedBean'アノテーションの間違った組み合わせを使用した可能性があります。あなたが間違った '@ SessionScoped'を撮ったとしたら、それは失敗したでしょう... – Kukeltje

関連する問題