在用于更新某个实体的JSF页面中,下拉列表用于选择所需的行:
然后所有字段都填充了所选的行信息,但下拉列表除外:
我在实体的托管bean中创建了两个方法,一个用于加载每个下拉列表。对于第一个,我使用了以下代码:
public List<Rede> getRedes() {
if (this.redes == null) {
redes = redeBean.findWithNamedQuery("Rede.findAll");
}
if (this.estabelecimento.getId() > 0) {
Map<String, Object> map = new HashMap<>();
map.put("estabelecimento_id", this.estabelecimento.getId());
this.rede = (Rede) redeBean.findWithNamedQuery("Rede.findByEstabelecimentoId", map).get(0);
for (Rede r : redes) {
if(Objects.equals(this.rede.getId(), r.getId())) {
this.rede = r;
}
}
}
return redes;
}
但estabelecimento.getId()
会引发NullPointerException
,但estabelecimento
不为空。 Estabelecimento在PostConstruct
方法中实例化。
alterar.xhtml页面:
<ui:define name="content">
<f:metadata>
<f:viewParam name="id" value="#{estabelecimentoMB.estabelecimento.id}" />
<f:viewParam name="redeId" value="#{estabelecimentoMB.rede.id}" />
<f:viewParam name="categoriaId" value="#{estabelecimentoMB.categoria.id}" />
</f:metadata>
<h:form id="form" enctype="multipart/form-data">
<p:growl id="growl" showDetail="true" sticky="true" globalOnly="true" />
<p:panelGrid id="pnl" columns="2">
<p:outputLabel for="estabelecimentos" value="Estabelecimento:" />
<p:selectOneMenu id="estabelecimentos" value="#{estabelecimentoMB.estabelecimento.id}" >
<f:selectItem itemValue="0" itemLabel="-- Selecione --" />
<f:selectItems value="#{estabelecimentoMB.estabelecimentos}" var="x" itemValue="#{x.id}" itemLabel="#{x.nomefantasia}" />
<p:ajax event="change" listener="#{estabelecimentoMB.prepareEdit(estabelecimentoMB.estabelecimento.id)}" update="@form" />
</p:selectOneMenu>
<p:message for="estabelecimentos" />
</p:panelGrid>
<p:separator />
<p:panelGrid id="pnl-info" columns="3">
<p:outputLabel for="cnpj" value="CNPJ:" />
<p:inputText id="cnpj" required="true" value="#{estabelecimentoMB.estabelecimento.cnpj}" />
<p:message for="cnpj" />
<p:outputLabel for="razaosocial" value="Razão Social:" />
<p:inputText id="razaosocial" required="true" value="#{estabelecimentoMB.estabelecimento.razaosocial}" />
<p:message for="razaosocial" />
<p:outputLabel for="nomefantasia" value="Nome Fantasia:" />
<p:inputText id="nomefantasia" required="true" value="#{estabelecimentoMB.estabelecimento.nomefantasia}" />
<p:message for="nomefantasia" />
<p:outputLabel for="cep" value="CEP:" />
<p:inputText id="cep" required="true" value="#{estabelecimentoMB.estabelecimento.cep}" />
<p:message for="cep" />
<p:outputLabel for="logradouro" value="Logradouro:" />
<p:inputText id="logradouro" required="true" value="#{estabelecimentoMB.estabelecimento.logradouro}" />
<p:message for="logradouro" />
<p:outputLabel for="numero" value="Número:" />
<p:inputText id="numero" required="true" value="#{estabelecimentoMB.estabelecimento.numero}" />
<p:message for="numero" />
<p:outputLabel for="razaosocial" value="Razão Social:" />
<p:inputText id="complemento" required="true" value="#{estabelecimentoMB.estabelecimento.razaosocial}" />
<p:message for="razaosocial" />
<p:outputLabel for="bairro" value="Bairro:" />
<p:inputText id="bairro" required="true" value="#{estabelecimentoMB.estabelecimento.bairro}" />
<p:message for="bairro" />
<p:outputLabel for="cidade" value="Cidade:" />
<p:inputText id="cidade" required="true" value="#{estabelecimentoMB.estabelecimento.cidade}" />
<p:message for="cidade" />
<p:outputLabel for="estado" value="Estado:" />
<p:inputText id="estado" required="true" value="#{estabelecimentoMB.estabelecimento.estado}" />
<p:message for="estado" />
<p:outputLabel for="pais" value="País:" />
<p:inputText id="pais" required="true" value="#{estabelecimentoMB.estabelecimento.pais}" />
<p:message for="pais" />
<p:outputLabel for="telefone" value="Telefone:" />
<p:inputText id="telefone" required="true" value="#{estabelecimentoMB.estabelecimento.telefone}" />
<p:message for="telefone" />
<p:outputLabel for="contato" value="Contato:" />
<p:inputText id="contato" required="true" value="#{estabelecimentoMB.estabelecimento.contato}" />
<p:message for="contato" />
<p:outputLabel for="email" value="E-mail:" />
<p:inputText id="email" required="true" value="#{estabelecimentoMB.estabelecimento.email}" />
<p:message for="email" />
<p:outputLabel for="site" value="Site:" />
<p:inputText id="site" required="true" value="#{estabelecimentoMB.estabelecimento.site}" />
<p:message for="site" />
<p:outputLabel for="latitude" value="Latitude:" />
<p:inputText id="latitude" value="#{estabelecimentoMB.estabelecimento.latitude}" />
<p:message for="latitude" />
<p:outputLabel for="longitude" value="Longitude:" />
<p:inputText id="longitude" value="#{estabelecimentoMB.estabelecimento.longitude}" />
<p:message for="longitude" />
<p:outputLabel for="redes" value="Rede:" />
<p:selectOneMenu id="redes" value="#{estabelecimentoMB.rede.id}" >
<f:selectItem itemLabel="-- Selecione --" itemValue="0" />
<f:selectItems itemLabel="#{rede.nomefantasia}" itemValue="#{rede.id}" value="#{redeMB.redes}" var="rede" />
</p:selectOneMenu>
<p:message for="redes" />
<p:outputLabel for="categorias" value="Categoria:" />
<p:selectOneMenu id="categorias" value="#{estabelecimentoMB.categoria.id}" >
<f:selectItem itemLabel="-- Selecione --" itemValue="0" />
<f:selectItems itemLabel="#{categoria.nome}" itemValue="#{categoria.id}" value="#{categoriaEstabelecimentoMB.categorias}" var="categoria" />
</p:selectOneMenu>
<p:message for="categorias" />
<p:commandButton action="#{estabelecimentoMB.save}" value="Salvar" update="@form" />
</p:panelGrid>
</h:form>
</ui:define>
prepareEdit
方法只包含以下行:this.estabelecimento = this.estabelecimentoBean.findById(id);
EstabelecimentoMB
是ViewScoped。
答案 0 :(得分:1)
在两个下拉列表中添加了noSelectionOption="true"
;
将prepareEdit
方法更改为:
public void prepareEdit(int id) {
Map<String, Object> map = new HashMap<>();
map.put("estabelecimento_id", id);
this.estabelecimento = this.estabelecimentoBean.findById(id);
this.rede = (Rede) this.redeBean.findWithNamedQuery("Rede.findByEstabelecimentoId", map).get(0);
this.categoria = (CategoriaEstabelecimento) this.categoriaBean.findWithNamedQuery("CategoriaEstabelecimento.findByEstabelecimentoId", map).get(0);
}
现在正在运作。