(JSF/Primefaces) Atualizar o <p:selectOneMenu depois de alterado no MB

Tenho uma situação que tenho uma lista de motoristas para ser selecionado.

Porém, caso seja selecionado e em outro <p:selectOneMenu não tenha sido selecionado nada ainda, isso é verificado no Bean, ele deverá retornar para “nada selecionado”, não estou conseguindo:

[code]<p:selectOneMenu id=“campoMotorista"
value=”#{ctrcBean.ctrc.motorista}" effect=“fade” filter=“true"
filterMatchMode=“startsWith” styleClass=“full-width"
valueChangeListener=”#{ctrcBean.motoristaChangeListener}“
label=”#{msg[‘label.cte.motorista’]}”>
<f:selectItem itemLabel=“Selecione” itemValue="" />

<f:selectItems value="#{ctrcBean.motoristas}" />

     <!-- Acredito que o problema esteja aqui -->
<p:ajax event="change" process="@this" render="@this"
	update="@this,panelInfoCarga,:formCtrc:growlCte" />

<f:converter binding="#{motoristaConverter}" />

</p:selectOneMenu>[/code]

No Bean:

[code] public void motoristaChangeListener(ValueChangeEvent event) {
if (event.getNewValue() instanceof Motorista) {
if (this.ctrc.getRemetente().getId() != null && this.ctrc.getDestinatario().getId() != null) {
Motorista motorista = (Motorista) event.getNewValue();
this.ctrc.setMotorista(motorista);

			if (motorista.getVeiculos().size() > 0) {
				Veiculo veiculo = motorista.getVeiculos().get(0);
				this.ctrc.setVeiculo(veiculo);
			}
		} else {
			this.ctrc.setMotorista(new Motorista());
			this.ctrc.setVeiculo(new Veiculo());
			
			// aviso para escolher remetente e destinatário
			Util.addError("Aviso",
					Util.getMessageBundle("label.cte.msg.erro.remetente.dest"));
		}
	} else {
		// Deselecionou o motorista

	}
}[/code]Alguém sabe como fazer isso?

Não entendi muito bem o seu problema.

Pela sua descrição eu entendi que existem 2 componentes selectOneMenu, correto? Tente descrever melhor o que deve acontecer nas interações entre eles, e o que está dando errado no seu caso.

Simplificando,

Preciso que se um valor for FALSE no bean esse <p:selectOneMenu volte para a posição “Selecione”.

Por exemplo quando a chamada ajax finaliza ele renderiza um botão, no caso daquele FALSE o botão não deverá ser renderizado.

Obrigado por tentar ajudar.

Você não pode simplesmente setar esse valor no seu valueChangeListener caso receba esse false?

Mas eu fiz isso o problema é que na tela ele não atualiza o componente.

No meu bean nesse momento está assim (sem resolver):

[code] public void motoristaChangeListener(ValueChangeEvent event) {
boolean remetDestOk = this.ctrc.getRemetente().getId() != null && this.ctrc.getDestinatario().getId() != null;
if (remetDestOk) {

} else {
// essa linha já coloca o valor que na tela deveria atualizar para a
// primeira posição da lista
this.ctrc.setMotorista(new Motorista());
this.ctrc.setVeiculo(new Veiculo());

		RequestContext.getCurrentInstance().execute("removerBtnImportarNota();");

		// aviso para escolher remetente e destinatário
		Util.addError("Aviso", Util.getMessageBundle("label.cte.msg.erro.remetente.dest"));

	}
}

[/code]

Na verdade não, o seu Selecione está definido assim:<f:selectItem itemLabel="Selecione" itemValue="" />o que não é igual a uma instância nova de Motorista, o ideal nesse caso seria você definí-lo assim: <f:selectItem itemLabel="Selecione" itemValue="null" />e quando receber esse false setar o motorista para null

Alterei para fazer a comparação com o null no motorista mas não deu certo.

Ele termina a chamada e na tela continua selecionado o item que foi selecionando antes da chamada ajax.

[code]<p:selectOneMenu id=“campoMotorista"
value=”#{ctrcBean.ctrc.motorista}" effect=“drop” filter=“true"
filterMatchMode=“startsWith” styleClass=“full-width"
valueChangeListener=”#{ctrcBean.motoristaChangeListener}“
label=”#{msg[‘label.cte.motorista’]}”>

<f:selectItem itemLabel="Selecione" itemValue="#{null}" />

<f:selectItems value="#{ctrcBean.motoristas}" />

<p:ajax event="change" process="@this" render="@form"
	update="@this,panelInfoCarga,:formCtrc:growlCte" />

<f:converter binding="#{motoristaConverter}" />

</p:selectOneMenu>[/code]

Bean:

[code]public void motoristaChangeListener(ValueChangeEvent event) {
boolean remetDestOk = this.ctrc.getRemetente().getId() != null && this.ctrc.getDestinatario().getId() != null;
if (remetDestOk) {
if (event.getNewValue() != null) {
Motorista motorista = (Motorista) event.getNewValue();
this.ctrc.setMotorista(motorista);

			if (motorista.getVeiculos().size() > 0) {
				Veiculo veiculo = motorista.getVeiculos().get(0);
				this.ctrc.setVeiculo(veiculo);
			}
		} else {
			// Deselecionou o motorista

		}
	} else {
		// essa linha já coloca o valor que na tela deveria atualizar para a
		// primeira posição da lista
		this.ctrc.setMotorista(null); // SETANDO para null - NÃO resolveu
		this.ctrc.setVeiculo(new Veiculo());
		
		RequestContext.getCurrentInstance().execute("removerBtnImportarNota();");

		// aviso para escolher remetente e destinatário
		Util.addError("Aviso", Util.getMessageBundle("label.cte.msg.erro.remetente.dest"));

	}
}[/code]

Cara, resolvi assim: