Jsf p:SelectOne菜单值仍然是必需的

Jsf p:SelectOne菜单值仍然是必需的,jsf,primefaces,jstl,selectonemenu,Jsf,Primefaces,Jstl,Selectonemenu,在我的xhtml页面中,我有两个独立的selectOneMenu,第二个由ajax调用填充。以下是jsf代码片段: <h:panelGrid columns="2" cellpadding="5"> <h:outputLabel value="Dirección:" for="direccion"/> <p:inputText id="direccion" value="#{datosInstitucion.institucion.di

在我的xhtml页面中,我有两个独立的selectOneMenu,第二个由ajax调用填充。以下是jsf代码片段:

   <h:panelGrid columns="2" cellpadding="5">
     <h:outputLabel value="Dirección:" for="direccion"/>
       <p:inputText id="direccion" value="#{datosInstitucion.institucion.direccion}" required="true" label="Dirección"/>
       <h:outputLabel value="Departamento:" for="departamento"/>
       <p:selectOneMenu id="departamento" value="#{datosInstitucion.idDepartamento}" required="true" label="Departamento">
          <f:selectItem itemLabel="Seleccione el departamento" itemValue="#{null}"/>
          <c:forEach items="#{datosInstitucion.departamentos}" var="departamento">
             <f:selectItem itemLabel="#{departamento.nombre}" itemValue="#{departamento.id}"/>
          </c:forEach>
          <f:ajax render="municipio" listener="#{datosInstitucion.cargarMunicipios()}"/>
       </p:selectOneMenu>
       <h:outputLabel value="Municipio:" for="municipio"/>
       <p:selectOneMenu id="municipio" value="#{datosInstitucion.idMunicipio}"                                           required="true" label="Municipio">
          <f:selectItem itemLabel="Seleccione el municipio" itemValue="#{null}"/>
             <c:forEach items="#{datosInstitucion.municipios}" var="municipio">
                <f:selectItem itemLabel="#{municipio.nombre}" itemValue="#{municipio.id}"/>
             </c:forEach>
       </p:selectOneMenu>
   </h:panelGrid>

这段代码位于primefaces向导组件中,因此当按下“下一步”按钮时,即使设置了值,也会导致第二个selectOneMenu的验证错误

是什么导致了这种行为

相关支持bean代码:

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

    @EJB
    private Instituciones instituciones;

    @EJB
    private Parametros parametros;

    @Inject
    private Mensajes mensajes;

    private List<Departamento> departamentos;
    private List<Municipio> municipios;
    private Map<Integer, Departamento> mapaDepartamentos;
    private Integer idDepartamento;
    private Integer idMunicipio;

    private Institucion institucion;

    @PostConstruct
    private void inicializar(){
        this.mapaDepartamentos = new HashMap<>();
        this.departamentos = parametros.consultarDepartamentos();
        for(Departamento departamento : departamentos){
            this.mapaDepartamentos.put(departamento.getId(), departamento);
        }
        this.prepararInstitucion();
    }

    private void prepararInstitucion(){
        this.institucion = new Institucion();
        this.institucion.setResponsable(new Persona());
    }

    public Institucion getInstitucion() {
        return institucion;
    }

    public List<Departamento> getDepartamentos(){
        return departamentos;
    }

    public TipoIdentificacion[] getTiposIdentificacion(){
        return TipoIdentificacion.deResponsables();
    }

    public Integer getIdDepartamento() {
        return idDepartamento;
    }

    public void setIdDepartamento(Integer idDepartamento) {
        this.idDepartamento = idDepartamento;
    }

    public Integer getIdMunicipio() {
        return idMunicipio;
    }

    public void setIdMunicipio(Integer idMunicipio) {
        this.idMunicipio = idMunicipio;
    }

    public void cargarMunicipios(){
        idMunicipio = null;
        if(idDepartamento != null){
            this.municipios = mapaDepartamentos.get(idDepartamento).getMunicipios();
        }else{
            this.municipios = Collections.emptyList();
        }
    }

    public List<Municipio> getMunicipios() {
        return municipios;
    }

    public void confirmar(){
        this.instituciones.guardar(institucion);
        this.mensajes.exito("La institución ha sido registrada en el sistema");
        this.prepararInstitucion();
    }
}
@ManagedBean(name=“datossitucion”)
@视域
公共类DatosInstitucion实现可序列化{
@EJB
私人机构;
@EJB
私人参数;
@注入
私人门萨;
私人名单部门;
私人名单城市;
私人地图;
私有整数iddepartmento;
私人整数城市;
私立研究所;
@施工后
私有虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚虚{
this.mapaDepartamentos=new HashMap();
this.departmentos=parametros.consultardepartmentos();
对于(departmento departmento:departmentos){
this.mapaDepartamentos.put(departamento.getId(),departamento);
}
这是一个;
}
私有无效制备制度(){
this.institucion=new institucion();
this.institucion.setResponsible(新角色());
}
公共机构{
返回机构;
}
公共列表getDepartmentos(){
返回部门;
}
公共提示标识[]GetTipAsidentificion(){
返回TIPOIdentification.deResponsables();
}
公共整数getIDDepartmento(){
返回总部;
}
公共void setIDdepartmento(整数IDdepartmento){
this.iddepartmento=iddepartmento;
}
公共整数getIdMunicipio(){
返回市政府;
}
公共无效setIdMunicipio(整数idMunicipio){
this.idMunicipio=idMunicipio;
}
公共无效cargarMunicipios(){
idMunicipio=null;
if(iddepartmento!=null){
this.municipios=mapaDepartamentos.get(idDepartamento.getMunicipios();
}否则{
this.municipios=Collections.emptyList();
}
}
公共列表getMunicipios(){
返回市政府;
}
公开无效确认书(){
本.研究所.瓜达尔(研究所);
这是mensajes.exito(“系统注册研究所”);
这是一个;
}
}

这是因为您将JSTL
与JSF一起使用。JSTL与JSF的生命周期很重要。JSTL在构建视图时执行,而JSF在呈现视图时执行。这两者并不同步工作。在您的情况下,您需要使用
而不是

替换:

<c:forEach items="#{datosInstitucion.municipios}" var="municipio">
      <f:selectItem itemLabel="#{municipio.nombre}" itemValue="#{municipio.id}"/>
</c:forEach>

与:



为了获得更多的阅读,我建议您阅读以下内容,这是因为您将JSTL
与JSF结合使用。JSTL与JSF的生命周期很重要。JSTL在构建视图时执行,而JSF在呈现视图时执行。这两者并不同步工作。在您的情况下,您需要使用
而不是

替换:

<c:forEach items="#{datosInstitucion.municipios}" var="municipio">
      <f:selectItem itemLabel="#{municipio.nombre}" itemValue="#{municipio.id}"/>
</c:forEach>

与:


要了解更多信息,我建议您阅读以下内容

使用
而不是JSTL
@fareed Yes,替换为已解决问题的。谢谢使用
代替JSTL
@fareed Yes,替换为解决问题的。谢谢