I have a selectCheckboxMenu with multiple=true where I set a few Entidades. After that, it populates another selectCheckboxMenu (Unidades) based on what Entidades I selected (ManyToOne relation). The problem is, when I click submit, Primefaces says my selectCheckboxMenu for Unidades is empty.
.xhtml:
<h:form>
<h:panelGrid>
<h:outputLabel for="entidades" value="Entidades"/>
<p:selectCheckboxMenu id="entidades"
required="true"
multiple="true"
filter="true"
filterMatchMode="contains"
label="Selecione"
requiredMessage="Selecione uma ou mais entidades"
value="#{userBean.entidadesId}"
title="Marque as entidades nas quais o colaborador faz parte.">
<p:ajax listener="#{userBean.onEntidadesChange}" update="unidades"/>
<f:selectItems value="#{userBean.entidadesDisponiveis}"
var="entidade"
itemLabel="#{entidade.nome}"
itemValue="#{entidade.id}"/>
</p:selectCheckboxMenu>
<h:outputLabel for="unidades" value="Unidades"/>
<p:selectCheckboxMenu id="unidades"
required="true"
multiple="true"
filter="true"
filterMatchMode="contains"
label="Selecione"
requiredMessage="Selecione uma ou mais unidades"
value="#{userBean.unidadesId}"
title="Marque as unidades nas quais o colaborador faz parte.">
<f:selectItems value="#{userBean.unidadesDisponiveis}"
var="unidade"
itemLabel="#{unidade.nome}"
itemValue="#{unidade.id}"/>
</p:selectCheckboxMenu>
</h:panelGrid>
</h:form>
<p:commandButton action="#{userBean.cadastrarNovoUsuario}"
value="Cadastrar"/>
UserBean.java:
@Named
@RequestScoped
public class UserBean implements Serializable {
private Long[] entidadesId;
private Long[] unidadesId;
private List<Unidade> unidadesDisponiveis;
private List<Entidade> entidadesDisponiveis;
@PostConstruct
public void init() {
entidadesDisponiveis = entidadeRepository.getEntidades();
}
public void onEntidadesChange(){
if (entidadesId != null && entidadesId.length > 0) {
unidadesDisponiveis = unidadeRepository.getUnidadesByEntidades(entidadesId);
} else {
unidadesDisponiveis = new ArrayList<>();
}
}
public List<Entidade> getEntidadesDisponiveis() {
return entidadesDisponiveis;
}
public List<Unidade> getUnidadesDisponiveis() {
return unidadesDisponiveis;
}
public Long[] getEntidadesId() {
return entidadesId;
}
public void setEntidadesId(Long[] entidadesId) {
this.entidadesId = entidadesId;
}
public Long[] getUnidadesId() {
return unidadesId;
}
public void setUnidadesId(Long[] unidadesId) {
this.unidadesId = unidadesId;
}
}
I noticed that, if I change {#userBean.getUnidadesDisponiveis()} for #{#userBean.unidadesDisponiveis} and populate it inside an init() method, I can pass validation, but then I won't be able to populate it based on what I choose in my selectCheckboxMenu id="entidades".
What could I be doing wrong?
I'm using Primefaces 8.0 and I get my data from PostgreSQL via Hibernate/C3P0.