Подтвердить что ты не робот

P: selectOneMenu не устанавливает значение в bean

Быстрый вопрос. Раньше это не случалось со мной при работе с SelectOneMenu. Это мой код.

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

И это моя поддержка 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;
}

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

<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 при каждом изменении. Вы никогда не устанавливаете значение.

Ответ 3

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

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