selectOneMenu nao recupera o valor (RESOLVIDO)

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

[code]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;
}

}[/code]

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

Sobrescreveu ou métodos equals e hashCode?

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.

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?

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?[/quote]

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.

Coloca implements Serializable nas classes de modelo também.

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

[quote=lele_vader]Coloca implements Serializable nas classes de modelo também.
[/quote]

Ambas já possuem o implements

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

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

[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

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

Alterei a tag para ajax mais ficou na mesma…

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>

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

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