2012-11-10 12 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" /> 

И это мой бэк-бэк.

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

Проблема заключается в следующем: каждый раз, когда я изменить значение в моей selectonemenu, значение опорной бина не установлен (хотя у меня есть сеттера для regionSelect). Почему это произойдет?

+0

Если ваша строка SelectItem item = new SelectItem (r.getCodigo(), r.getNombre()); дает нечто иное, чем String как ItemValue, вы получите ошибку с плохим значением (вы можете попробовать использовать , чтобы увидеть, что-то не так) –

+0

Оба значения, установленные в SelectItem, являются строками и '' не говорит мне ничего нового. –

+0

У вас есть другие поля в этой форме? Если да, обновляются ли другие поля? –

ответ

21

Я нашел ошибку, и это было ... довольно странно и косвенно. Я добавил следующую строку внутри SelectOneMenu:

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

и теперь все работает отлично.

+1

Отлично, я все еще использую RichFaces, поэтому я думаю, что есть некоторые отличия! –

+0

Возможно, что они по-разному отличаются по своему поведению! –

+3

Это ожидаемое поведение. Ваш пример установит значение 'selectOneMenu' в форме submit. Если вы хотите установить его с помощью ajax, вы должны указать его. Пожалуйста, отметьте свое сообщение как ответ. –

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

должен быть

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

Вот почему вы должны иметь вызов AJAX для обновления каждый раз, когда происходит изменение. Вы никогда не устанавливаете значение.

+0

Использует ли 'var =" region "itemValue =" # {region} "', что было допрошено? –

-1

Я обнаружил, что когда у меня возникла эта проблема, это было из-за @ViewScoped. С использованием SessionScoped вместо этого работал нормально.

Интересно, что в другом проекте с ViewScoped он работал. Я не могу объяснить.

+1

Вы, скорее всего, использовали неправильную комбинацию '@ ViewScoped' и' @ Named'/'@ ManagedBean' Annotation. Если бы вы взяли неправильный '@ SessionScoped', это не сработало бы ... – Kukeltje

 Смежные вопросы

  • Нет связанных вопросов^_^