selectOneMenu primefaces não envia valor para Bean

selectOneMenu primefaces não envia valor para Bean

Olá Pessoal quero solicitar um auxilio no recurso de combobox do primefaces, em que
montei conforme abaixo mas não funciona, testei de várias formas baseando nos foruns da net
usando por exemplo valueChangeListener e não funcionou.

Meu xhtml

value="#{ msg['configuracao.mensagem.opcoes'] } "
for="idOpcoes" />
<p:selectOneMenu id="idOpcoes"
	value="#{teste}">
	<f:selectItem itemLabel="#{ msg['selecione.um'] }" 
	         		  noSelectionOption="true" />
	<f:selectItem itemLabel="Opcao 1" itemValue="1" />
	<f:selectItem itemLabel="Opcao 2" itemValue="2" />
	<p:ajax update=":formPrincipal:grid" 
		listener="#{meuBBean.changePanel}" />
</p:selectOneMenu>

Meu Bean
// Var para pegar o valor do selectItem
@Getter @Setter
private Object value = “”;

public void changePanel(AjaxBehaviorEvent event) {

            // Testando para ver qual valor chega pelo event
	System.out.println("\n\n\n Valor q chegou event" +event.getSource());

            // Testando para ver qual valor chega pela var value
	System.out.println("\n\n\n Valor q chegou String" +value.toString() );

	if (event.getSource().equals("1")) {
		habilitaPanelGrig = true;
	}
	else if (event.getSource().equals("2"))
		habilitaPanelGrig = false;
	}
}

Me retorno isso

Valor q chegou String
[04/11/19 23:25:22:041 BRST] 0000012e SystemOut O
[04/11/19 23:25:24:645 BRST] 0000012c SystemOut O

Valor q chegou eventorg.primefaces.component.selectonemenu.SelectOneMenu@a42092ff
[04/11/19 23:25:24:645 BRST] 0000012c SystemOut O

Olha faz assim no:

<p:ajax  event="change" update=":formPrincipal:grid" 
		listener="#{meuBBean.changePanel}" />

E coloca esse combo entre <h:form>

Bom dia @Pereira1

O valor da propriedade value do <p:selectOneMenu> tem como propósito setar o valor da opção escolhida, no atributo passado na propriedade.

Ex:

<p:selectOneMenu id="idOpcoes" value="#{pessoaBean.carroSonho}" >
    <f:selectItem itemLabel="Porsche" itemValue="Porsche" />
    <f:selectItem itemLabel="BMW" itemValue="BMW" />
    <f:selectItem itemLabel="Mercedes" itemValue="Mercedes" />
</p:selectOneMenu>

No código acima, estou dizendo que o atributo carroSonho da minha classe PessoaBean, receberá o valor da opção desejada, mas isso só será feito depois de submeter o formulário.
Caso queira que o valor ja seja setado no atributo, imediatamente após a seleção, você pode utilizar o ajax do primefaces para fazer isso:

<p:selectOneMenu id="idOpcoes" value="#{pessoaBean.carroSonho}" >
    <f:selectItem itemLabel="Porsche" itemValue="Porsche" />
    <f:selectItem itemLabel="BMW" itemValue="BMW" />
    <f:selectItem itemLabel="Mercedes" itemValue="Mercedes" />

    <p:ajax event="itemSelect" update="@this" listener="{pessoaBean.meuListener} />
</p:selectOneMenu>
public void meuListener() {
    if(carroSonho.equals("Porsche") {
        ...
    }
}

Ao invés de receber o valor do evento, voce pode setar o valor direto num atributo seu e fazer as validações. Do jeito que voce esta fazendo (através do evento), voce terá que fazer um cast do source para a classe correspondente do componente e então pegar o valor.

Vi que você pretende habilitar um panelGrid com base na opção escolhida.
Caso o seu panelGrid esteja mais ou menos assim:

<h:panelGrid rendered="#{bean.habilitaPanelGrid}" >

Voce vai precisar dar um update nele também, na verdade não nele, no componente pai dele. Pois o update só funciona em componentes que estão renderizados no DOM e como o panelgrid pode não estar no DOM (devido a condição do rendered), o update não irá funcionar, para solucionar isso, basta colocar um componente como pai dele e efetuar o update nesse componente pai:

<h:panelGroup id="meuPanelGroup">
    <h:panelGrid rendered="#{bean.habilitaPanelGrid}" 
        ...
    </h:panelGrid>
<h:panelGroup>
<p:selectOneMenu id="idOpcoes" value="#{pessoaBean.carroSonho}" >
    <f:selectItem itemLabel="Porsche" itemValue="Porsche" />
    <f:selectItem itemLabel="BMW" itemValue="BMW" />
    <f:selectItem itemLabel="Mercedes" itemValue="Mercedes" />

    <p:ajax event="itemSelect" update="@this meuPanelGroup" listener="{pessoaBean.meuListener} />
</p:selectOneMenu>
1 curtida

Mike,

Obrigado pelo retorno e pela dica.

Vi que a questão era o valor declarado no value do selectOneMenu no meu caso de nome “teste” que eu não havia declarado no Bean:

Correção

– myBean
@Getters @Setters
private String teste;

value="#{ msg[‘configuracao.mensagem.opcoes’] } "
for=“idOpcoes” />
<p:selectOneMenu id=“idOpcoes”
value="#{meuBBean.teste}">
<f:selectItem itemLabel="#{ msg[‘selecione.um’] }"
noSelectionOption=“true” />
<f:selectItem itemLabel=“Opcao 1” itemValue=“1” />
<f:selectItem itemLabel=“Opcao 2” itemValue=“2” />
<p:ajax update=":formPrincipal:grid"
listener="#{meuBBean.changePanel}" />
</p:selectOneMenu>

De qualquer forma vc já adiantou uma coisa que eu não estava visualizando.

Obrigado