Ao editar os dados popular SelectOneMenu

Boa tarde pessoal,

Eu tenho uma tela de cadastro de empresa…
Eu fiz uma forma de quando eu selecionar a UF, ele lista as cidades daquela UF.
Blz está funcionando certinho…

EU tenho a tela de consulta de Empresa… Essa tela lista todas as empresas cadastradas.
E tem o botão editar, quando eu clicar nesse botão eu quero que ele vá para a tela de cadastro de empresa e populo todos os campos…
Até ai blz… ele populava quando a UF e a cidade eram texts… agora que são combos e são dados na base…com uma tabela estado e uma tabela cidade… eu não consigo popula-los… ele traz todos os objetos preenchidos(empresa, endereco, estado e cidade); mas eu não sei como eu faço para popular o combo… eu achei alguma coisa sobre configurar o faces-config.xml, mas não achei uma forma de como configura-lo…se eh realmente isso que é necessário para fazer.

Quem pude me ajudar eu agradeço muito…segue abaixo o código…

Empresa.xhtml

                                        <h:panelGroup>
						<h:selectOneMenu id="estado" value="#{empresaBean.estado.codigo}">
							<f:selectItem itemValue="" itemLabel="Selecione..." />
							<f:selectItems value="#{empresaBean.estados}" />
							<f:ajax execute="estado" render="cidade" event="change" listener="#{empresaBean.actionCarregaCidades}"></f:ajax>
						</h:selectOneMenu>
					</h:panelGroup>
					<h:panelGroup>
						<h:selectOneMenu id="cidade" value="#{empresaBean.cidade.codigo}">
							<f:selectItem itemValue="" itemLabel="Selecione..." />
							<f:selectItems value="#{empresaBean.cidades}"></f:selectItems>
						</h:selectOneMenu>
					</h:panelGroup>

EmpresaBean.java

public class EmpresaBean {

	private Empresa empresa = new Empresa();
	private Endereco endereco = new Endereco();
	private List<Empresa> lista;
	private String destinoSalvar = "/restrito/empresa";
	private List<SelectItem> cidades = new ArrayList<SelectItem>();
	private Estado estado = new Estado();
	private Cidade cidade = new Cidade();

	public String novo() {
		this.empresa = new Empresa();
		this.endereco = new Endereco();
		this.estado = new Estado();
		this.cidade = new Cidade();
		return "/restrito/Empresa";
	}

	public void salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		EmpresaRN empresaRN = new EmpresaRN();
		EnderecoRN enderecoRN = new EnderecoRN();
		CidadeRN cidadeRN = new CidadeRN();
		EstadoRN estadoRN = new EstadoRN();

		Cidade cid = cidadeRN.buscarPorId(this.cidade.getCodigo());
		Estado est = estadoRN.buscarPorId(this.estado.getCodigo());

		this.endereco.setEstado(est);
		this.endereco.setCidade(cid);

		enderecoRN.salvar(this.endereco);

		this.empresa.setEndereco(this.endereco);

		if (!empresaRN.salvar(this.empresa)) {
			return;
		}

		FacesMessage facesMessage = new FacesMessage(
				"Fornecedor salvo com sucesso");
		context.addMessage(null, facesMessage);
		this.novo();
	}

	public String editar() {
		this.setEndereco(this.empresa.getEndereco());
		this.endereco.setEstado(this.endereco.getEstado());
		return "/restrito/empresa";
	}

	public String excluir() {
		EmpresaRN empresaRN = new EmpresaRN();
		empresaRN.excluir(this.empresa);
		this.lista = null;
		return null;
	}

	/**
	 * @return the listaEstado
	 */
	public List<SelectItem> getEstados() {
		EstadoRN estadoRN = new EstadoRN();

		List<Estado> listaEstado = estadoRN.listar();

		List<SelectItem> itens = new ArrayList<SelectItem>(listaEstado.size());

		for (Estado s : listaEstado) {
			itens.add(new SelectItem(s.getCodigo(), s.getSigla(), s.getNome()));
		}

		return itens;
	}

	public void actionCarregaCidades() {
		this.cidades = this.getCidadesByEstado();
	}

	public List<SelectItem> getCidadesByEstado() {
		CidadeRN cidadeRN = new CidadeRN();

		List<Cidade> cidades = cidadeRN.listar(this.estado.getCodigo());

		List<SelectItem> items = new ArrayList<SelectItem>(cidades.size());

		for (Cidade c : cidades) {
			items.add(new SelectItem(c.getCodigo(), c.getNome()));
		}

		return items;
	}

Se alguém tiver alguma sugestão de melhorar o código eu aceito tbm… porque sou novato…

vlww!!

Eu acabei de descobrir uma coisa… não sei se ajuda na minha dúvida…

Eu estava usando o scopo request no faces-config.xml…
porém quando eu clicava em salvar…ele perdia as informações do combo e não salvava…

então coloquei view… agora ele salva…mas quando eu consulto e clico em editar ele não popula…
mas se eu deixo request… ele popula…

o session ele não perde as informações… sempre ficam la…

=´[

não sou muito bom em java + tenta fazer o seguinte

1° dexa request

2° retire todos os Objeto objeto = new Objeto();
3° coloque no construtor padrão da classe!

axo q só isso vai funcionar!

pelo que to vendo, vc ta passando certo, mais quando vc da um " = new " vc perde as informações…

qualquer coisa debuga seu método salvar e você vai ver as variáveis no console.

Você precisa de um converter para mandar um objeto para um selectOnMenu.

[code]public class EstadoConverter implements Converter {

public Object getAsObject(FacesContext context, UIComponent component, String value) {  
    return EstadoBC.buscar(value);  
}  

public String getAsString(FacesContext context, UIComponent component, Object value) {  
    return ((Estado) value).toString();  
}  

} [/code]

<h:selectOneMenu id="estado" value="#{empresaBean.estado.codigo}" converter="ufConverter" > <f:selectItem itemValue="" itemLabel="Selecione..." /> <f:selectItems value="#{empresaBean.estados}" /> <f:ajax execute="estado" render="cidade" event="change" listener="#{empresaBean.actionCarregaCidades}"></f:ajax> </h:selectOneMenu>

e adicionar o converter no faces-config:

<converter> <description>Um converter</description> <converter-id>ufConverter</converter-id> <converter-class> javabeat.jsf.CustomConverter </converter-class>

:slight_smile:

Opa… vlw pela ajuda pessoal…

Umas dúvidas…

Mas o que seria esse EstadoBC.buscar(value)??

Eu continuo com o request mesmo?

E quando ele vai usar essa classe EstadoConverter??

Eu tenho um combo Cidade tbm… eu crio um para cidade??

Vlw!!!

Só uma informação…

Quando eu clico em salvar… ele nem entra no método salvar()…
Ele vai la no getEstados()…

E fala que a cidade não possui um valor válido…

vais usar o ufConverter quando chamar seu h:selectOneMenu, e sim é ideal usar um converter para cada item mostrado em um combo, pois o compo não é um tipo primitivo e o JSF não sabe qual atributo do objeto retornar no menu.

Desculpa minha ignorância, mas o que é esse

EstadoBC.buscar(value)??

Eu tentei descobrir mais ou menos o que era…
agora está dando erro quando ele tenta dar o cast nessa linha
“((Estado) value).toString();”

public class EstadoConverter implements Converter {

	private EstadoRN estadoRN = new EstadoRN();

	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {
		return estadoRN.buscarPorId(Integer.valueOf(value));
	}

	public String getAsString(FacesContext context, UIComponent component,
			Object value) {
		return ((Estado) value).toString();
	}

}

Faces-config.xml

<converter>  
     <description>Converter Estado</description>  
     <converter-id>ufConverter</converter-id>  
     <converter-class>br.com.estudos.sgi.estado.EstadoConverter</converter-class>
</converter>