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.