selectOneMenu nao recupera o valor (RESOLVIDO)

15 respostas
O

Olá pessoal, estou voltando ao fórum com um problema que está me deixando doido já li e reli vários tópicos e tutoriais porém não consegui
resolver o problema...
A coisa parece simples, estou fazendo um combo de empresas e cargos,
consigo recuperar a lista de empresas facilmente, porém ao tentar pegar o id da empresa selecionada para consultar a tabela de cargos por este id
não consigo recuperar o valor...

Segue o código:

index.xhtml
<h:form>
            <h:panelGrid columns="2">
                <h:outputLabel for="empresaa" value="Estado " />
                <h:selectOneMenu id="empresaa"
                                 required="true"
                                 rendered="true"
                                 value="#{regiaoMB.idSelect}">
                    
                        <f:selectItems value="#{empresaBean.listaEmpresa}"
                                       var="v"  
                                       itemValue="#{v.idEmpresa}" 
                                       itemLabel="#{v.nome}"/>
                        
                        <a4j event="onchange" 
                             ajaxSingle="true"	
                             action="#{regiaoMB.actionCarregaCidades()}" 
                             reRender="empresaa,cargoo"/>  
                        
                </h:selectOneMenu>

                <h:outputLabel for="cargoo" value="Cargo " />
                <h:selectOneMenu id="cargoo" 
                                 value="#{regiaoMB.cargo.idCargo}"
                                 rendered="true">
                        
                    <f:selectItem itemValue="" 
                                  itemLabel="Selecione..." />
                    <f:selectItems value="#{regiaoMB.cargos}" />
                    
                </h:selectOneMenu>
            </h:panelGrid>
	</h:form>
Meu Bean
package teste;

import FactoryMethod.FactoryDAO;
import Interface.ICargoDAO;
import Interface.IEmpresaDAO;
import Model.Cargo;
import Model.Empresa;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

@ManagedBean
@SessionScoped
public class RegiaoMB implements Serializable {

	private static final long serialVersionUID = -4281390476508498320L;
        private ICargoDAO dao               = (ICargoDAO) FactoryDAO.creatObject(Cargo.class);
        private IEmpresaDAO daoe            = (IEmpresaDAO) FactoryDAO.creatObject(Empresa.class);
	
        private List<SelectItem> cargos = new ArrayList<SelectItem>();
	private Empresa empresa = new Empresa();
	private Cargo cargo = new Cargo();
	
        private int idSelect = 0;
        
	public List<SelectItem> getEmpresas() throws ParseException, SQLException{
		
		List<Empresa> lista = daoe.Listar();		
		List<SelectItem> itens = new ArrayList<SelectItem>(lista.size());		
		for(Empresa s : lista){  
			itens.add(new SelectItem(s.getIdEmpresa(), s.getNome()));
		}
		return itens;
	}
	
	public void actionCarregaCidades() throws ParseException, SQLException{	
            int a = this.idSelect; // Só utilizei essa linha para ver o valor da variável
            this.cargos = this.getCidadesByEstado();
	}
	
	public List<SelectItem> getCidadesByEstado() throws ParseException, SQLException{  
            
		List<Cargo> listCargo = dao.ListCargoCombo(1);
		List<SelectItem> items = new ArrayList<SelectItem>(cargos.size());  
		for(Cargo c : listCargo){  
			items.add(new SelectItem(c.getIdCargo(), c.getNomeCargo()));  
		}	
		return items;
	}

    public int getIdSelect() {
        return idSelect;
    }

    public void setIdSelect(int idSelect) {
        this.idSelect = idSelect;
    }

        
    public List<SelectItem> getCargos() {
            return cargos;
    }

    public void setCidades(List<SelectItem> cargos) {
            this.cargos = cargos;
    }

    public Empresa getEmpresa() {
            return empresa;
    }

    public void setEmpresa(Empresa empresa) {
            this.empresa = empresa;
    }

    public Cargo getCargo() {
            return cargo;
    }

    public void setCargo(Cargo cargo) {
            this.cargo = cargo;
    }
}

Ao debugar o sistema vejo que o valor da variável idSelect está como zero, ou seja, não está recuperando o valor...
Podem me ajudar por favor, preciso resolver isso para dar prosseguimento ao meu sistema.
Grato

15 Respostas

E

Sobrescreveu ou métodos equals e hashCode?

L

Coloca um execute com o id do select one menu para o seu valor ir para o método do managed bean eu acho.
Isso no a4j event.

Os métodos de value change listener não tem que ter um parâmetro dizendo o evento ?

Coloca um prependId = false no seu h:form para o id ser o que você está colocando exatamente.

O

Obrigado por tentar me ajudar…
Segui um tutorial para implementar esses códigos do xhtml e do bean, porém em momento algum o autor mencionou algo a respeito do equals e hashCode.
O que devo fazer?

E

Obrigado por tentar me ajudar…
Segui um tutorial para implementar esses códigos do xhtml e do bean, porém em momento algum o autor mencionou algo a respeito do equals e hashCode.
O que devo fazer?

Sobrescrever os métodos equals e hashCode e ver se funciona. :lol:
As classes que tive que fazer um selecItem, tive que fazer isso. O erro pode ser algo do código que eu não tenha achado também. Mas enfim, não custa nada tentar.

L

Coloca implements Serializable nas classes de modelo também.

O

Pessoal desculpe minha ignorância mais sou nob em java, estou acostumado com dot.net e php rsrs

Ja tentei utilizar o valueChangeListener do SelectOneMenu, da mesma forma ao recuperar o valor ele vem como nulo

Não sei como sobrescrever os metodos

O

lele_vader:
Coloca implements Serializable nas classes de modelo também.

Ambas já possuem o implements

O

e ai pessoal, mais alguma ideia???
Tentei um simples select e mesmo assim não consigo recuperar o valor

L

Tenta ver esse tópico aqui.
A pessoa teve o mesmo problema que você eu acho.

O

[quote=lele_vader]Tenta ver esse tópico aqui.
A pessoa teve o mesmo problema que você eu acho.

Valew pela tentativa, usei as dicas mencionadas no topico mais sem sucesso…
Ta tenso isso aqui viu…

Um detalhe que observei é que no meu codigo eu utilizo

<a4j ...

Ja no exemplo o código é

<a4j:support ...

tentando alterar para este código o netbeans acusa o erro dizendo que o suporte não pertence ao componente ajax

L

a4j são componentes do richfaces.
Se você quiser usar o jsf nativo é ajax somente e não a4j

O

Alterei a tag para ajax mais ficou na mesma…

F

oliveira_lb,

para pegar valores de um selectOneMenu no JSF você necessita de um converter!

Mas não se assute, é bem simples de se fazer!
Você só necessita de uma classe com a anotação @FacesConverter

Eu tenho um converter pronto aqui para um objeto Aluno, no seu caso você tem que trocar para o seu objeto Empresas:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.onsave.sasep.model.util;

import br.com.onsave.sasep.dao.aluno.AlunoDao;
import br.com.onsave.sasep.model.aluno.Aluno;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

/**
 *
 * @author flavio
 */
 
@FacesConverter(forClass=Aluno.class)
public class AlunoConverter implements Converter{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String string) {
        if(string == null || string.isEmpty()){
            return null;
        }
        return new AlunoDao().get(Integer.valueOf(string), Aluno.class);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object object) {
        Aluno aluno = (Aluno) object;
        if(aluno == null || aluno.getId() == null){
            return null;
        }
        return String.valueOf(aluno.getId());
    }
   
}

Após isso adicione no xhtml no selectOneMenu a propriedade converter

<h:outputText value="Aluno:"  />
<p:selectOneMenu value="#{alunoController.aluno}" converter="AlunoConverter" id="selectAluno">
    <f:selectItem itemLabel="Selecione..." itemValue="" />
    <f:selectItems value="#{alunoController.alunos}" />
</p:selectOneMenu>
L

Ele setou o itemValue, então não precisaria de um converter acredito eu.
E é de tipo primtivo,a mesma coisa do value do selectOneMenu

O

Deus é pai… Resolvi o problema com algumas alterações

Eu havia feito

<ajax ...

alterei para <f:ajax ...

No meu bean troquei a anotação para

@ViewScoped

Chamei o evento listener="#{regiaoMB.actionCarregaCidades(event) dentro da tag <f:ajax conforme o amigo fez uma observação acima

Por fim no Bean acrescentei o evento ao método passando a ficar assim public void actionCarregaCidades(AjaxBehaviorEvent event)

Segue o Código completo

index.xhtml

<h:form prependId = "false">
            <h:panelGrid columns="2">
                <h:outputLabel for="empresaa" value="Estado " />
                <h:selectOneMenu id="empresaa"
                                 required="true"
                                 value="#{regiaoMB.idSelect}">
                    
                        <f:selectItems value="#{empresaBean.listaEmpresa}"
                                       var="v"  
                                       itemValue="#{v.idEmpresa}" 
                                       itemLabel="#{v.nome}"/> 
                        
                        <f:ajax event="change" 
                                render="cargoo" 
                                listener="#{regiaoMB.actionCarregaCidades(event)}"/>                     
                        
                </h:selectOneMenu>

                <h:outputLabel for="cargoo" value="Cargo " />
                <h:selectOneMenu id="cargoo" 
                                 value="#{regiaoMB.cargo.idCargo}"
                                 rendered="true">
                        
                    <f:selectItem itemValue="" 
                                  itemLabel="Selecione..." />
                    <f:selectItems value="#{regiaoMB.cargos}" />
                    
                </h:selectOneMenu>
            </h:panelGrid>
	</h:form>

Bean

import FactoryMethod.FactoryDAO;
import Interface.ICargoDAO;
import Interface.IEmpresaDAO;
import Model.Cargo;
import Model.Empresa;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

@ManagedBean
@ViewScoped
public class RegiaoMB implements Serializable {

	private static final long serialVersionUID = -4281390476508498320L;
        private ICargoDAO dao               = (ICargoDAO) FactoryDAO.creatObject(Cargo.class);
        private IEmpresaDAO daoe            = (IEmpresaDAO) FactoryDAO.creatObject(Empresa.class);
	
        private List<SelectItem> cargos = new ArrayList<SelectItem>();
	private Empresa empresa = new Empresa();
	private Cargo cargo = new Cargo();
	
        private int idSelect = 0;
        
	public List<SelectItem> getEmpresas() throws ParseException, SQLException{
		
		List<Empresa> lista = daoe.Listar();
		
		List<SelectItem> itens = new ArrayList<SelectItem>(lista.size());
		
		for(Empresa s : lista){  
			itens.add(new SelectItem(s.getIdEmpresa(), s.getNome()));
		}
		return itens;
	}
	
	public void actionCarregaCidades(AjaxBehaviorEvent  event) throws ParseException, SQLException{	
            this.cargos = this.getCidadesByEstado();
	}
	
	public List<SelectItem> getCidadesByEstado() throws ParseException, SQLException{  
            
		List<Cargo> listCargo = dao.ListCargoCombo(this.idSelect);
		List<SelectItem> items = new ArrayList<SelectItem>(cargos.size());  
		
		for(Cargo c : listCargo){  
			items.add(new SelectItem(c.getIdCargo(), c.getNomeCargo()));  
		}
		
		return items;
	}

    public int getIdSelect() {
        return idSelect;
    }

    public void setIdSelect(int idSelect) {
        this.idSelect = idSelect;
    }

        
    public List<SelectItem> getCargos() {
            return cargos;
    }

    public void setCidades(List<SelectItem> cargos) {
            this.cargos = cargos;
    }

    public Empresa getEmpresa() {
            return empresa;
    }

    public void setEmpresa(Empresa empresa) {
            this.empresa = empresa;
    }

    public Cargo getCargo() {
            return cargo;
    }

    public void setCargo(Cargo cargo) {
            this.cargo = cargo;
    }
}

Quero agradecer a todos pelas respostas
Grato

Criado 1 de outubro de 2012
Ultima resposta 1 de out. de 2012
Respostas 15
Participantes 4