GARANTIR DESCONTO

Fórum Capturar o evento change em um p:selectOneMenu do tipo Enum #516356

10/04/2015

0

Não consigo capturar o evento de mudança do componente p:selectOneMenu, cuja a fonte de carregamento é um enum. Registrei na minha view o evento change do Ajax, contudo o método do listener não é chamado.

A minha view utiliza o seguinte código para fazer o carregamento do combo:
<p:selectOneMenu id="analise" value="#{fooMB.analise}" converter="AnaliseConverter">
    	<f:selectItem itemLabel="Selecione"/>
    	<f:selectItems value="#{fooMB.carregarComboAnalise}" var="analise" itemLabel="#{analise.descricao}" itemValue="#/>
    	<f:ajax event="change" listener="#{fooMB.changeComboAnalise}"/>
</p:selectOneMenu>


O enum tem o seguinte código:
public enum AnaliseEnum {
    
    	AVALIACAO("Avaliação"), 
    	SUGESTAO("Sugestão"), 
    	RECLAMACAO("Reclamação"), 
    	OUTROS("Outros");
    
    	private String descricao;
    
    	private AnaliseEnum(String descricao) {
    		this.descricao = descricao;
    	}
    
    	public String getDescricao() {
    		return this.descricao;
    	}
 }


O meu ManagedBean possui o seguinte método usado para realizar o carregamento do combo:
public AnaliseEnum[] carregarComboAnalise() {
    	return  AnaliseEnum.values();
}


O meu converter tem o seguinte código:
@FacesConverter(value = "AnaliseConverter")
    public class AnaliseConverter extends EnumConverter {
    
    	public AnaliseConverter() {
    		super(AnaliseEnum.class);
    	}
}


O método adicionado no listener do componente não imprime a informação no console, ou seja, não é acionado.
 public void changeComboAnalise(AjaxBehaviorEvent event) {
    	System.out.println("Deveria fazer alguma coisa aqui, mas não faz .... ");
}


O combo carrega normalmente, mas o método changeComboAnalise() chamado no evento "change" não é executado.
Geison Santos

Geison Santos

Responder

Posts

11/04/2015

Geison Santos

Bom, descobri o motivo de o método registrado no listener do componente p:selectOneMenu não ter sido invocado. Por algum motivo que desconheço estava ocorrendo alguma falha ema uma das fazes do ciclo de vida do request do JSF.

SOLUÇÃO

Para solucionar o problema adicionei ao componente selectOneMenu o atributo immediate="true". No meu caso, não é necessário passar por todas as fazes do ciclo de vida.

Uma de minhas suspeitas era a de que deveria utilizar o p:ajax no lugar de f:ajax o que se mostrou uma suspeita infundada, visto que a resolução do problema se ateve ao atributo immediate.

HERANÇA DO PROBLEMA

A partir da pesquisa para solucionar o problema acabei conhecendo o GenericEnumConverter do projeto OmniFaces desenvolvido por Bauke Scholtz, o BalusC, e Arjan Tijms. Este conversor substitui a necessidade de criar conversores específicos para Enums.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar