Mensagem de erro enfileirada mas não renderiza

Bom dia pessoal, estou querendo enteder/resolver um problema de implementação, tenho a seguinte situação:

Quando o usuário acessa a app /telaInicial.xhtml ele deve digitar usuário e senha para se logar, logando ele fica na mesma página telaInicial.xhtml, porém está logado e tem acesso aos recursos da página, e um deles é mostrar em um DataTable com alguns documentos que vencem de hoje (new date()) até os próximos 7 dias, se tiver documentos vencendo mostro os documentos no datable, se não tiver documentos, mostro uma mensagem dizendo que não tem documentos vencendo de hoje até os próximos sete dias.

Quando tem documento renderiza o DataTable com seus respectivos documentos, até aqui OK.

Problema é, que quando o DataTable está vazio, não esta mostrando a mensagem no contexto atual, ele mostra a mensagem quando clico em outro link qualquer e renderiza a página com o mensagem quer era para ter sido renderizada na telaInicial.xhtml.


@Named("consultaTelaInicial")
@ConversationScoped
public class ConsultaTelaInicialBean extends ComumBean<Documento> implements Serializable {

	
	private static final long serialVersionUID = 4557446191442854849L;
	private Documento documentoEntity, documentoAux;
	private Date dataInicio, dataFim;
	

	@EJB
	DocumentoService documentoService;

	
	@Override
	@PostConstruct
	public void init() {
		if(conversation.isTransient()) {
			documentoEntity = new Documento();
			documentoEntity.setNumContrato(new Contrato());
			conversation.begin();
		}
		else
			consultar();
	}


public void consultar() {
		
		
		try{
			
			setDatas(); // configurando datas para passar como paramentro no Documento Entity
										
			documentoEntity.setDt_inicio_validade(dataInicio);
			documentoEntity.setDt_fim_validade(dataFim);

			dataModel = new PagedCollectionModel<Documento, Documento>(pageSize, documentoService, documentoEntity);
			
	
			if (dataModel.getRowCount() == 0) {
					
					FacesContext context = FacesContext.getCurrentInstance();
						context.addMessage(null, 
								new FacesMessage(FacesMessage.SEVERITY_INFO, "Nenhum Documento vencido hoje até os próximos sete dias", null));
				
				}
				
			} catch (Exception e) {
				mostraMensagem(FacesMessage.SEVERITY_ERROR, e.getMessage());
			
			} 
				
		
	}	

No console:

09:57:55,490 INFO  [javax.enterprise.resource.webcontainer.jsf.renderkit] AVISO: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos.
sourceId=null[severity=(INFO 0), summary=(Nenhum Documento vencido hoje até os próximos sete dias), detail=(Nenhum Documento vencido hoje até os próximos sete dias)]

Beleza no contexto ele pegou a mensagem e enfileirou, mas não entendo pq não renderizou, sendo que tenho o <h:messages/> definido na página telaInicial.xhtml.

Li em tópicos anteriores que alguns colegas tiveram problema inclusive com a mesma mensagem do console, mas no meu é um pouco diferente pq o usuário clica no botão de logar, e executa um método de login do loginMB, se ele estiver logado (user/pass - correto) redireciona para tela telainicial.xhtml, que possui o consultaTelainicialMB. Para executar esse bean não teve uma “ação” do usuário na telaInincial.xhtml.

E o método consultar acima ja fiz dele sem retorno, e com retorno, tipo sem retorno executa o método porém fica na mesma página pelo q entendo, com return ""; seria como a página fosse atualizada ou eu poderia redirecionar para outra regra de navegação.

Estou trabalhando com JSF 2 e EBJ 3 nessa aplicação.

Ps. pelo que pesquisei, no console aquele null quer aparece para sourceId, quer dizer que não tem um componente (form:inputText) relacionado a mensagem que estou passando para o usuário.

Outra coisa que pelo visto pode fazer sentido, embora não tenho certeza da minha afirmação, é que na hora que renderiza a telainicial.xhtml, ela não passa por todo ciclo de vida do JSF, por não executar o método através do componente, tipo um commandLink ou commandButton, por que é feito um redirecionamento do login para telainicial.xhtml. Essa parte tenho um pouco mais de dificuldade pq não tenho conhecimento sólido no JSF, algo que estou procurando e propondo aos caros em entrar nessa discussão, para esclarecer minha dúvida.

Obrigado.

coloque o public void consultar() para retornar null ao invés de “”. Pelo menos era o que era falado no livro que li.

Outra coisa, você esta fazendo por ajax? Ou action normal mesmo?

Se for com retorno em que ser public String consultar() return null, testei mas não deu certo tbm…

Não é por Ajax.

Outra coisa que tentei foi pegar a variável do componente datatable e se ele fosse vazio (empty) imprimia na tela um <h:outputText value=“Sem docs vencidos” rendered=“empty telaConsultaMB.dataModel”/>

Mas não renderiza, outra tentativa foi controlar a variável, semelhante a maneira demonstrada acima.

Criei uma variável no telaConsultaMB, tipo boolean verifica, que controla a renderização do <h:outputText /> mas tbm sem sucesso. Funciona assim se veriica = false, rendered=“false” senão rendered=“true” onde rendered=“telaConsultaMB.verifica”. verifica = rue ou false.

Por acaso, alguém sabe como faço para mostrar um mensagem caso o datatable esteja vazio.

Eu sei que o Primefaces já tem um atributo maroto para isso.

JSF normal ainda não, você teria que fazer um rendered e um texto e no datatable, onde caso fosse vazio=true mostrava o texto e false mostrava o datatable.

Oii gente,

Então, venho pedir a ajuda de vocês pra tentar decifrar o que está acontecendo pra msg não aparecer.

O erro é o seguinte:

Informações [javax.enterprise.resource.webcontainer.jsf.renderkit] (http--127.0.0.1-8080-1) AVISO: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos. sourceId=null[severity=(INFO 0), summary=(Mês selecionado não possui cardápios cadastrados.), detail=(Mês selecionado não possui cardápios cadastrados.)]

Eu tenho uma página onde crio uma lista de datas em um selectOneMenu.

		[code]<div class="campo-simples">
			<h:outputLabel value="Mês / Ano" />
			<p:selectOneMenu id="listDatasCardapio" required="true"
				requiredMessage="Selecione mês e ano"
				value="#{relatorioCardapioBean.dataSelecionada}" effect="fade"
				style="width:200px;">
				<f:selectItem itemLabel="Selecione um mês" itemValue="" />
				<f:selectItems value="#{relatorioCardapioBean.listaMeses}"
					var="dataSelecionada" itemValue="#{dataSelecionada}" />
				<p:ajax listener="#{relatorioCardapioBean.converterData}"
					update="cardapios" />
			</p:selectOneMenu>
		</div>[/code]

De acordo com a data selecionada eu puxo do banco de dados os cardápios que foram cadastrados naquela data.

<div class="campo-grupo"> <h:outputLabel value="Cardápio" /> <p:selectOneMenu style="width:346px;" id="cardapios" value="#{relatorioCardapioBean.cardapioSelecionado}" converter="entityConversor"> <f:selectItem itemLabel="Selecione um cardápio" itemValue="" /> <f:selectItems value="#{relatorioCardapioBean.cardapios}" var="cardapio" itemLabel="#{cardapio.nome} / #{cardapio.nivelEscolar.nivel} / #{relatorioCardapioBean.getPeriodo(cardapio.periodo)}" itemValue="#{cardapio}" /> </p:selectOneMenu> </div>

Uso o p:messages para exibir minhas mensagens.
Ele tá assim na página:

<p:messages id="msg" autoUpdate="true" showDetail="true" />

No Bean o código está assim:

[code]@ManagedBean(name = “relatorioCardapioBean”)
@SessionScoped
public class RelatorioCardapioBean {
private Date dataCardapio = new Date();
private String dataSelecionada;
private List listaMeses = new ArrayList();
private List cardapios = new ArrayList();
private Cardapio cardapioSelecionado;

public void converterData(AjaxBehaviorEvent event) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“MMMM / yyyy”);
// Parse da data selecionada
try {
dataCardapio = simpleDateFormat.parse(dataSelecionada);
} catch (Exception e) {
e.printStackTrace();
}
}

public List getCardapios() {
CardapioRN cardapioRN = new CardapioRN();
this.cardapios = cardapioRN.listarPorPeriodo(dataCardapio);
// TODO - Exibir essa mensagem na tela ao selecionar um mês que não
// existe cardápios

	if (cardapios.isEmpty()) {
		GeralUtil.addMensagem(FacesMessage.SEVERITY_INFO,
				"Mês selecionado não possui cardápios cadastrados.");
		return null;
	}

	return cardapios;
}

public Cardapio getCardapioSelecionado() {
	return cardapioSelecionado;
}

    public String getDataSelecionada() {
	return dataSelecionada;
}

    public List<String> getListaMeses() {
	listaMeses.clear();
	Calendar cal = Calendar.getInstance();
	cal.setTime(new Date());
	int mes = cal.get(Calendar.MONTH) + 1;
	int ano = cal.get(Calendar.YEAR) - 1;
	for (int i = 1; i <= 12; i++) {
		listaMeses.add(DataHoraUtil.dataFormatada(
				DataHoraUtil.criarData(1, mes + i, ano), "MMMM / yyyy"));
	}
	return listaMeses;

}

    public void setCardapios(List<Cardapio> cardapios) {
	this.cardapios = cardapios;
}

public void setCardapioSelecionado(Cardapio cardapioSelecionado) {
	this.cardapioSelecionado = cardapioSelecionado;
}

public void setDataSelecionada(String dataSelecionada) {
	this.dataSelecionada = dataSelecionada;
}[/code]

Como a lista de datas é do tipo String eu preciso converter ela, é onde uso o método converterData()

Estou tentando exibir a msg da linha 28 quando a data selecionada não trazer nenhum cardápio. Ou seja, quando a List cardapios estiver vazia.
E obtenho esse erro

Alguém pode me ajudar por favor?