Selectonemenu is not loaded when selecting object for editing

Asked

Viewed 982 times

19

I have a component SelectOneMenu (Primefaces) of cities, which is loaded according to the selected state.

My component is with following behavior, right after saving the object and then selecting it on DataTable through a commandLink for editing, the component is loaded with the city normally, but if I leave the page and return to do the editing later, this component is not loaded.

I have already done the degug and the value of the city comes filled, but I do not know why it is not presented in the component. If anyone can help me, I have tried everything.

Address class with mappings

@Entity
@Table(name="TENDERECO", schema="SGCADM")
public class Endereco implements Serializable{
private Cidade cidade;
    private Estado estado;
    private Pessoa pessoa;

@JoinColumn(name = "CODCID", referencedColumnName = "CODCID")
        @ForeignKey(name = "fk_endereco_cidade")    
        public Cidade getCidade() {
            if (cidade == null) {
                cidade = new Cidade();
            }
            return cidade;
        }

        public void setCidade(Cidade cidade) {
            this.cidade = cidade;
        }

        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "CODESTA", referencedColumnName = "CODESTA")
        @ForeignKey(name = "fk_endereco_estado")    
        public Estado getEstado() {
            if (estado == null) {
                estado = new Estado();
            }
            return estado;
        }
        public void setEstado(Estado estado) {
            this.estado = estado;
        }   

        @OneToOne(targetEntity = Pessoa.class, fetch=FetchType.LAZY)    
        @JoinColumn(name = "CODPES", referencedColumnName = "CODPES")
        @ForeignKey(name = "fk_endereco_pessoa")
        public Pessoa getPessoa() {
            return pessoa;
        }
        public void setPessoa(Pessoa pessoa) {
            this.pessoa = pessoa;
        }

Bean with scopo @viewScoped

@ManagedBean(name="funcionarioBean")
@ViewScoped
public class FuncionarioBean implements Serializable{

    @EJB private FuncionarioBO funcionarioBO;

    @EJB private CidadeBO cidadeBO;

    @EJB private EstadoBO estadoBO;     

    @PostConstruct
    public void init(){
        this.listCargo = cargoBO.buscarCargos();
        this.listEstado = estadoBO.buscarEstados(); 
        this.listGerentesSupervisores = funcionarioBO.listaGerentesSupervisores();
        listarFuncionarios();
    }

    public void populaCidades(AjaxBehaviorEvent event) throws TransactionalException {
        listCidadePorEstado = cidadeBO.buscarCidadesPorEstado(getFuncionario().getEndereco().getEstado().getCodigoEstado());
    }

    public void salvar() throws PersistenceException, ParseException {
        try {
            funcionario.setDataCadastro(dataAtual);
            funcionario.setTipoPessoa(TipoPessoaEnum.FISICA);
            funcionario.setDataNascimento(formata.parse(DateUtils.formataData(funcionario.getDataNascimento())));
            funcionario.getEndereco().setDataCadastro(dataAtual);
            funcionario.getEndereco().setPessoa(funcionario);
            funcionarioBO.salvarFuncionario(funcionario);
            FacesUtil.info("Funcionário foi salvo com sucesso ! ");
            listarFuncionarios();
            limpar();
        } catch (TransactionalException e) {
            e.printStackTrace();
            logger.error("Não foi possível salvar Funcionario ! " + e.getMessage());
            FacesUtil.error(FacesMessage.SEVERITY_ERROR, "Não foi possível salvar funcionário ! ", e.getMessage());
        }
    }

    public void editar(){
        funcionario = funcionarioBO.find(funcionario.getCodigoFuncionario());
        disable = false;
        btnNew = true;
        btnSave = false;
        btnCancel = false;
    }


}

Implementation of the Method buscaCidadePorEstado

public List<Cidade> buscarCidadesPorEstado(Long codigoEstado) throws TransactionalException{
         Criteria cri = getSession().createCriteria(Cidade.class)
                 .add(Restrictions.eq("estado.codigoEstado", codigoEstado));         
        return cri.list();

    }

selectOneMenu State and City together with commandLink searching the selected object from my datatable:

<p:selectOneMenu id="Selest" value="#{funcionarioBean.funcionario.endereco.estado.codigoEstado}" required="true" requiredMessage="O campo ESTADO é obrigatório !" style="width:175px; margin-left: 5px; font-weight:bold;" disabled="#{funcionarioBean.disable}">
  <f:selectItem itemLabel="" itemValue="" />
  <f:selectItems value="#{funcionarioBean.listEstado}" var="item" itemLabel="#{item.descricao}" itemValue="#{item.codigoEstado}" />
  <f:ajax event="change" render="Selcid" listener="#{funcionarioBean.populaCidades}" />
</p:selectOneMenu>

<p:selectOneMenu id="Selcid" value="#{funcionarioBean.funcionario.endereco.cidade.codigoCidade}" style="width:175px; margin-left: 5px;font-weight:bold;" required="true" requiredMessage="O campo CIDADE é obrigatório !" disabled="#{funcionarioBean.disable}">
  <f:selectItem itemLabel="" itemValue="" />
  <f:selectItems value="#{funcionarioBean.listCidadePorEstado}" var="cid" itemLabel="#{cid.descricao}" itemValue="#{cid.codigoCidade}" />
</p:selectOneMenu>



<p:column id="edit" width="9%" style="text-align:center">
  <p:commandLink action="#{funcionarioBean.editar}" ajax="false" update=":form:view">
    <p:graphicImage value="/resources/img/icon/Edit16x16.png" />
    <f:setPropertyActionListener value="#{obj}" target="#{funcionarioBean.funcionario}" />
  </p:commandLink>
</p:column>
  • 1

    It is necessary to inform a convert in selectOneMenu, in many cases it is also necessary to be rewritten the Equals method. On the site of the first faces is a very complete example: http://www.primefaces.org/showcase/ui/input/oneMenu.xhtml

  • 2

    Hello! It’s been a while since I used Primefaces, but I’ve had problems like this and sometimes I could solve it by updating the component, in this case the Selectonemenu. Try to do that and let us know what happens =)

  • 1

    Where is declared the listCidadePorState?

  • 1

    If you edit without leaving the page the change is saved normally?

2 answers

1

Call populaCities in edit():

 public void editar(){
        funcionario = funcionarioBO.find(funcionario.getCodigoFuncionario());
        populaCidades(null);
        disable = false;
        btnNew = true;
        btnSave = false;
        btnCancel = false;
    }

When you first enter the page, to create the employee you do not expect the list of cities to be filled in. When choosing a state will fire the event and popular the ciades list. OK. Hence when you return to the listing and select the same employee for editing, as the scope of the bean Managed is view, funcionarioBean is still with listCidadePorEstado filled.

Now, if you leave the page, this is from the scope, when you go back to the page and choose the employee for editing the list of cities is not filled and there has been no event that populates it.

1

No need to update="Selcid" your status combo?

 <f:ajax event="change" render="Selcid" update="Selcid" listener="#{funcionarioBean.populaCidades}" />

Browser other questions tagged

You are not signed in. Login or sign up in order to post.