(RESOLVIDO)Padronização de Escopos

Olá pessoal,a minha dúvida é a seguinte.Estou tentando mostrar uma mensagem de erro com meu managed bean implementando viewscoped,mas aparecem varias mensagens ao invés de apenas mostrar uma.Sobre essas inúmeras mensagens a culpa e do tipo de sessão que estou utilizando?existe alguma maneira de mostrar mensagens sem que ocorra este problema?Existe uma maneira de fechar a sessão apos a visualização da mensagem?

Olá amigo,

por acaso está usando messages ou growl do Primefaces?

1 curtida

Ola Edumatias,estou usando o messages.

Pode postar seu ManagedBean e o seu xhtml para análise?

1 curtida

Aqui está

Managed Bean:

@ManagedBean(name = “etiquetaBean”)
@ViewScoped
public class EtiquetaBean implements Serializable {

private static final long serialVersionUID = 1L;

private Etiqueta etiqueta = new Etiqueta();
private List<Etiqueta> lista;
private Etiqueta etiquetaSelecionada = new Etiqueta();
private StreamedContent arquivoRetorno;
private String adicionarCampo;
private TreeNode nodePrincipal;	
private TreeNode nodeselecionado;	
private TreeNode nodeTransacao;
private BigInteger id_etiqueta;
	
public EtiquetaBean() {}
				

public TreeNode getNodePrincipal() {
												
			this.nodePrincipal = new DefaultTreeNode("Root", null);				
										
			List<Transacao_Etiqueta> lista = new ArrayList<>();	
				if(pesquisar() != null){					
				lista = pesquisar();	
											
						for(Transacao_Etiqueta valor : lista){
							
							nodeTransacao = new DefaultTreeNode(valor.getId_transacao_etiqueta() + "-" + valor.getId_transacao().getDescricao(),this.nodePrincipal);
												
							nodeTransacao.setSelectable(false);	
																							
							for(Campo_Adicional campAdic : valor.getId_transacao().getCampo_Adicional()){

									TreeNode nodeCampAdic = new DefaultTreeNode(campAdic.getId_camp_adic() + "-" + campAdic.getDescricao(),nodeTransacao);
																								
								}				
								
						}
						
						return nodePrincipal;
				}else{
					
					FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Warning!", "Esta etiqueta não existe2"));
					return null;
				}
				
				
}
	
		
   public List<Transacao_Etiqueta> pesquisar(){		 
	
		   
		EtiquetaRN etiquetaRN = new EtiquetaRN();			
		List<Transacao_Etiqueta> lista;   
		   
		lista = etiquetaRN.retornoRastreabilidade(this.id_etiqueta);
		
		if(lista.isEmpty()){
			
			return null;
			
		}else{
		
			UsuarioRN usuarioRN = new UsuarioRN();
			
			String chaveUsuLogado = usuarioRN.preencherDados().getCod_empresa() + "," + usuarioRN.preencherDados().getCod_filial() + "," + usuarioRN.preencherDados().getCod_unidade();
			
			Iterator<Transacao_Etiqueta> it = lista.iterator();
			Iterator<Transacao_Etiqueta> it2 = lista.iterator();
			Iterator<Transacao_Etiqueta> it3 = lista.iterator();
						
			String chaveEtiqueta = it.next().getCod_empresa() + "," + it2.next().getCod_filial() + "," + it3.next().getCod_unidade();
			
			if(chaveUsuLogado.contains(chaveEtiqueta)){
				
				return lista;	
				
			}else{
				
				return null;
				
			}
			
		}
   		 
	
   }
  
}

XHTML:

<h:head>
Consulta Rastreabilidade
</h:head>
<ui:composition template="/template/interna.xhtml">

<ui:define name="titulo"></ui:define>

	<ui:define name = "corpo">
			
			<h:form id = "formMessages">
				<p:messages autoUpdate="true" showDetail="true" closable="true"/>
			</h:form>
			
		<h:form id ="id">
		
			<p:panelGrid columns="2" styleClass="ui-panelgrid-blank">     
				
				<p:inputText value="#{etiquetaBean.id_etiqueta}">
					<p:ajax event="keyup" update="search"/>						
				</p:inputText>
				
				<p:commandButton action="#{etiquetaBean.pesquisar()}" update="id"
				value="Pesquisar"
				id="search"/>	      
		 	</p:panelGrid><br/><br/>
		 	
		 	<p:commandButton action="#{etiquetaBean.consultaDetalhes()}" value="Detalhes" style="margin-left:10px"/>
		 	<br/><br/>
		 				 	
		 	<p:tree 			 	
		 	value="#{etiquetaBean.nodePrincipal}"
		 	var="node"		 	
		 	selectionMode="single"
		 	selection="#{etiquetaBean.nodeselecionado}"			 	
		 	rendered = "#{etiquetaBean.id_etiqueta != null}"
		 	style="margin-left:10px">
		 				 				 		
			 	<p:treeNode>					 				 	 				 	
				 		<h:outputText value="#{node}"/>						 						 				 											 					 					 		
				</p:treeNode>
					 		
		 	</p:tree>
		 	
		</h:form>
		
	</ui:define>

</ui:composition>

Vamos tentar algumas soluções

A primeira é remover o componente de dentro do form e tentar atualizar via id definindo um ID para o messages e remover o atributo autoUpdate=“true”. Ao proceder o formulário via button tenta atualizar com update=“id, idDefinidoNoMessages”.

Opção 2 seria debbugar seu Managed bean e verificar se ele está entrando mais de uma vez no método que joga o message no contexto (addMessage). Se estiver entrando mais de uma vez temos outro problema.

1 curtida

Eu testei a primeira opção sobre atualizar e nao deu certo,mas fiz uns testes aqui e com o requestscoped a mensagem aparece apenas umas vez,mas com esse tipo de escopo atrapalha o metodo que eu preciso para pegar o valor do node que selecionei

Veja se o ajax não está dando um submit no seu button.

<p:inputText value="#{etiquetaBean.id_etiqueta}">
		<p:ajax event="keyup" update="search"/>						
</p:inputText>

Pelo que percebo a cada tecla pressionada ele aplica um update no seu commandButton cujo ID é search. Se ele tiver procedendo o submit deve estar entrando no metodo pesquisar() e carregando no contexto diversas vezes a mensagem, ou seja, toda vez que uma tecla é pressionada.

De algum modo ele está entrando no else no método getNodePrincipal e inserindo diversas vezes a mensagem.

1 curtida

Sim edumatias!

O problema era isso mesmo,a mensagem aparecia varias vezes porque o método de pesquisa estava dentro do meu node,consegui validar sem precisar utilizar o método dentro e deu certo,apareceu só uma vez.Muito obrigado pela atenção,uma boa tarde para você edumatias

Ótimo.