jsf - 下拉列表未使用实体&更新其选定值 - 所选实体中的NPE getId()

时间:2014-07-02 12:42:38

标签: jsf drop-down-menu primefaces nullpointerexception

在用于更新某个实体的JSF页面中,下拉列表用于选择所需的行:

enter image description here

然后所有字段都填充了所选的行信息,但下拉列表除外:

enter image description here

我在实体的托管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。

1 个答案:

答案 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);
}

现在正在运作。