Erro ao efetuar pesquisa com p:commandbutton

9 respostas
Diego_Adriano

Bom galera … estou tendo problea para efetuar a pesquisa no banco utilizando o p:commandbutton … o método no Bean é chamado … porem o objeto passado é null … porém se eu utilizar o h:commandbutton a consulta é efetuda com sucesso …

Assim o metodo no bean é chamado … porem esta nulo

<p:commandButton value="Buscar" action="#{clienteBean.busca}" ajax="false" update="teste" immediate="true"/>

Desta forma é chamado o método no Bean e efetuado a consulta com sucesso …

<h:commandButton value="Busca">
				<f:ajax
  									event="click"
  									execute="@form"
  									listener="#{clienteBean.busca}"
  									render="@form"/>	
				</h:commandButton>

Bean

public Cliente busca(){
		System.out.println("ID "+" "+ Cliente.getId());//vejo se o objeto esta preenchido
		System.out.println("CPF "+" "+ Cliente.getCpf());
		try{
			
			if (this.Cliente != null){
			
				ClienteRepository repository = new ClienteRepository(this.entityManager);
				this.Cliente = repository.consulta(this.Cliente);
			}
				
			return Cliente;
		
		} catch (NoResultException e){
			
			FacesContext.getCurrentInstance().addMessage("consulta:id",new FacesMessage("Usuário não Cadastrado"));
			
			return null;
		
		}
		
	}

Console quando uso o p:commandobutton

INFO: ID  null
INFO: CPF  null
INFO: REPOSITORY CONSULTA CPF

Console quando uso o h:commandobutton

INFO: ID  2
INFO: CPF  
INFO: REPOSITORY CONSULTA ID  2

Se alguem puder me ajudar eu agradeço … só dependo disso para liberar o modulo …
Vlw

9 Respostas

Diego_Adriano

Alguem já pssou por isso ?
Vi em alguns posts que o Ajax poderia estar causando problema … já habilitei desabilitei e ele não funciona com o p:commandButton … porém no metodo de cadastro de Cliente ele executa normalmente …

E

Tente adicionar execute="@form". Ou execute=’'nomeForm".

ronnytds

quando vc usa o h:commandButton vc tbm coloca immediate=true? pq talvez seja isso, já que o valor true do immediate deixa os valores do bean nulos.

Diego_Adriano

Edu … no primefaces não tem o execute …
Ronnytds fiz como vc sugeriu retirei o immediate e funcionou … Seguindo seu raciocinio percebi q o h:commandbutton n possui o immediate … bem … eu tinha em mente que ele servia para n validar o formulario … mas agora andei lendo sobre o assunto e percebi q estava com o conceito errado …

Mais uma vez agradeço a vcs pela ajuda …

Abraço …

Diego_Adriano

Me desculpem … eu havia colocado como Resolvido … mas fui testar o meu botão de limpar e ele parou de funcionar. … parcialmente …
tipo … se eu preencho o formulário e clico no botao limpar antes de enviar ele funciona … porém se efetuo a busca ele n responde qdo clico nele …

<p:commandButton value="Limpar" type="reset" update="teste"/>

Se alguem puder ajudar … vlw

E

Diego Adriano:
Edu … no primefaces não tem o execute …
Ronnytds fiz como vc sugeriu retirei o immediate e funcionou … Seguindo seu raciocinio percebi q o h:commandbutton n possui o immediate … bem … eu tinha em mente que ele servia para n validar o formulario … mas agora andei lendo sobre o assunto e percebi q estava com o conceito errado …

Mais uma vez agradeço a vcs pela ajuda …

Abraço …

Ahã. Colei errado aqui. Seria o process em vez de execute.

ronnytds

cara, esse botão com a função de limpar é meio complexo mesmo, pq tem hora que ele limpa numa boa, mas parece que se vc vai no bean e seta algum objeto(que não seja um simples atributo), o botão não consegue limpar direito. talvez o melhor seja criar um método no bean para limpar todos os atributos e ai no botão vc chama esse método do bean e no update do botão vc manda atualizar o form, ou o panel, ou o panelgrid, seja qual vc estiver usando.

Takeshi91

Fiquei com preguiça de ler

Se você quer um botão que gere uma atualização em ajax na tela, use a p:commandButton

Se você quer um botão que funcione como o botão do JSF, só usar a p:commandButton e definir a sua propriedade Ajax como “False”

A action de ambos poderá executar um método, se você quer atualizar um componente, além de mandar um update, você deverá redefinir o valor que esta recebe la na ManagedBean.

E

Uso o seguinte para limpar um form

UIForm form = (UIForm) context.getViewRoot().findComponent("seuform");
        if (form != null) {
            cleanSubmittedValues(form);
        }


    private void cleanSubmittedValues(UIComponent component) {
        if (component instanceof EditableValueHolder) {
            EditableValueHolder evh = (EditableValueHolder) component;
            evh.setSubmittedValue(null);
            evh.setValue(null);
            evh.setLocalValueSet(false);
            evh.setValid(true);
        }
        if (component.getChildCount() > 0) {
            for (UIComponent child : component.getChildren()) {
                cleanSubmittedValues(child);
            }
        }
    }
Criado 4 de abril de 2011
Ultima resposta 5 de abr. de 2011
Respostas 9
Participantes 4