Problea com filtro em formulário e selectOneMenu

6 respostas
S
Olá, pessoal, tenho um problema simples, porém não estou achando a solução. Bem, tenho uma tela que gostaria, que quando selecionasse um cliente, abaixo seus dados pudessem ser mostrados: Este selectOneMenu obtém dados provenientes de uma lista
<h:selectOneMenu id="Cliente" onchange="submit()" label="Pessoa"
				immediate="true" value="#{atendimentoBean.clienteSelecionado}}"
				valueChangeListener="#{atendimentoBean.buscaPorNome}">
				<f:selectItems value="#{atendimentoBean.clientes}">
				</f:selectItems>
				<a4j:ajax event="change" render="dados" listener="#{atendimentoBean.buscaPorNome}"  >
				</a4j:ajax>
			</h:selectOneMenu>
Este é o método que preenche o SelectOne Acima:
public List<SelectItem> getClientes() {
		if (this.clientes == null) {
			this.clientes = new ArrayList<SelectItem>();
			List<Cliente> clientes = new ClienteService().listarTodos();
			this.clientes.add(new SelectItem(null, "Selecione"));
			for (Cliente cliente : clientes) {
				this.clientes.add(new SelectItem(cliente, cliente.getNome()));
			}
		}
		return this.clientes;
	}
O meu objetivo é que quando selecione o cliente, seus respectivos dados pudessem ser também carregados na tela a partir de inputText's:
<h:panelGrid id="dados" columns="2">
				<h:outputText Value="#{clienteBean.clienteEdicao.nome}"></h:outputText>

				<h:outputText value="Cidade" />
				<h:inputText value="#{clienteBean.clienteEdicao.cidade}" />

				<h:outputText value="Bairro" />
				<h:inputText value="#{clienteEdicao.bairro}" />

				<h:outputText value="Endereço" />
				<h:inputText value="#{clienteBean.clienteEdicao.endereco}" />

				<h:outputText value="Estado" />
				<h:inputText value="#{clienteBean.clienteEdicao.estado}" />

				<h:outputText value="Cpf" />
				<h:inputText value="#{clienteBean.clienteEdicao.cpf}" />

			</h:panelGrid>
Tentei deste modo, sem sucesso, sendo esta declaração no Mbean AtendimentoBean:
public Cliente buscaPorNome(ValueChangeEvent event,Long id) {
		System.out.println("Nome Selecionado : " + event.getNewValue());
		Cliente cliente = new ClienteService().pesquisaPorId(id);

		return cliente;
	}
Em uma classe Cliente Service Isso:
public Cliente pesquisaPorId(Long id) {
		DAOFactory daoFactory = DAOFactory.getDAOFactory();
		ClienteDAO clienteDAO = daoFactory.getClienteDAO();
		Cliente cliente = clienteDAO.pesquisarPorId(id);
		return cliente;
	}
Obs, isso chamando à partir de uma interface um DAO genérico contendo isso:
public T pesquisarPorId(Serializable id) {
		return (T) this.session.get(this.persistentClass, id);
	}

Por favor, preciso muito desta solução, conto com a ajuda dos prezados que puderem me auxiliar.

6 Respostas

Hebert_Coelho

Aqui mostra como fazer: JSF Exemplos Simples com Ajax.

No exemplo acima não utilizar banco de dados, aprenda o conceito que você conseguirá aplicar à sua necessidade.

S

Muito obrigado, Hebert, vou tentar implementar, qualquer dúvida vou postar.
Para fazer isso não vou usar nenhuma consulta à tabelas e/ou bancos?

Hebert_Coelho

smnj:
Muito obrigado, Hebert, vou tentar implementar, qualquer dúvida vou postar.
Para fazer isso não vou usar nenhuma consulta à tabelas e/ou bancos?
Creio que sim. Afinal, quando a pessoa selecionar um valor você terá que buscar tudo em algum lugar.

Se não estiver na sessão do http vai ter que ir ao banco.

O Exemplo mostrará como ao selecionar um valor atualizar uma parte da página.

S

Tentei usar seu exemplo, mas meu erro está indo além do que imaginaria:
Estou tendo esse erro:
Erro de conversão ao definir o valor '6' para 'null Converter'. Erro de conversão ao definir o valor '6' para 'null Converter'.

É bem verdade que queria pegar esse bendito id, que é o que está reclamando aí, visto que no banco é o mesmo valor, mas o porém está que mesmo que eu declare um converter diretamente, ( não sei pq, mas só declará-lo no FacesConfig não acontece nada além do mesmo erro.

Bem, tentei assim na Página:

<h:messages id="myMessage" globalOnly="false" showDetail="true"></h:messages>
		<h5>Digite seu nome</h5>
		<br></br>
		&lt;h:panelGroup&gt;
			&lt;h:selectOneMenu id="inputname" label="${msgs.prompt}"
				immediate="true" value="#{clienteBean.clientes}"&gt;
				&lt;f:selectItems value="#{clienteBean.clientes}"
					itemLabel="#{clienteBean.clientes}"
					itemValue="#{clienteBean.clientes}" converter="Converter" &gt;
				&lt;/f:selectItems&gt;
				&lt;f:ajax render="myName myMessage client" execute="inputname"
					event="change"&gt;&lt;/f:ajax&gt;
			&lt;/h:selectOneMenu&gt;
		&lt;/h:panelGroup&gt;
		<br></br>

		&lt;h:panelGroup id="client"&gt;
			&lt;h:inputHidden value="#{clienteBean.clienteEdicao.id}"&gt;&lt;/h:inputHidden&gt;
			&lt;h:outputText id="myName" value="#{clienteBean.clienteEdicao.nome}"&gt;&lt;/h:outputText&gt;
			&lt;h:outputText value="#{clienteBean.clienteEdicao.id}"&gt;&lt;/h:outputText&gt;
		&lt;/h:panelGroup&gt;

Não sei se é significativo, mas este é meu converter:

package br.com.siscorimetry.conversores;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

import br.com.siscolorimetry.dominio.Cliente;
import br.com.siscolorimetry.negocio.ClienteService;

@FacesConverter(value = "Converter")
public class ClienteConverter implements Converter {
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) throws ConverterException {
		if (value == null) {
			return null;
		}
		return new ClienteService().pesquisaPorId(Long.parseLong(value));
	}

	public String getAsString(FacesContext context, UIComponent component,
			Object object) throws ConverterException {
		if (object == null) {
			return null;
		}
		Cliente cliente = (Cliente) object;
		return cliente.getId().toString();
	}

}
E não tive sucesso, o que sugere?
S

?

S

Tem como me dar uma mão nesse problema?
Ainda não consegui ter sucesso.

Criado 23 de outubro de 2012
Ultima resposta 25 de out. de 2012
Respostas 6
Participantes 2