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?
Ola Edumatias,estou usando o messages.
Pode postar seu ManagedBean e o seu xhtml para análise?
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.
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.
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.