Fala galera do GUJ!
Esse é o meu primerio post aqui no GUJ, por isso se eu infringir alguma regra, por favor me avisem... :)
Peço a ajudas de vocês para um problema que eu já pesquisei muito e não achei resposta.
A minha página exibe uma lista, lista esta que é obtida do meu managedBean. Vou chamar esta lista de "objects". Acontece que está lista e obtida da base de dados através do hibernate toda vez que é executado o método "getObjects".
Então, eu quis fazer um teste, queria saber se, caso houvesse uma excessão ao buscar esta lista, eu conseguiria exibir uma mensagem na página para o usuário. Então eu não iniciei o banco, justamente para estourar a exceção. Ocorre que eu consigo capturar a exceção através do try catch e crio uma mensagem no JSF através do "FacesContext.getCurrentInstance().addMessage", mas essa mensagem não é exibida na página. A lista aparece em branco, mas a mensagem do "h:messages" não aparece. Curioso que eu tenho um outro método que salva na base um item desta lista, e implementei o mesmo esquema do método "getObjects" e a mensagem aparece com sucesso na página.
O que me ocorre é que o problema se dá porque a exceção acontece durante o carremento da página, e não depois de uma ação, como no caso do click do botão save.
Para facilitar o entendimento, vou colocar o código. O que eu chamei de "objects" antes, é a propriedade "brokers" aqui. Primeiro da página:
<rich:messages id="globalMessages" ajaxRendered="true" globalOnly="true">
<f:facet name="errorMarker">
<h:graphicImage value="/img/error.gif"/>
</f:facet>
</rich:messages>
<rich:dataTable value="#{brokerBean.brokers}" var="broker" id="brokerList" rowClasses="odd-row,even-row" cellpadding="0" cellspacing="0" >
<f:facet name="header">
<rich:columnGroup>
<h:column>
<h:outputLabel value="Nome"/>
</h:column>
<h:column>
<h:outputLabel value="Fracionário"/>
</h:column>
<h:column>
<h:outputLabel value="Lote"/>
</h:column>
<h:column></h:column>
<h:column></h:column>
</rich:columnGroup>
</f:facet>
<rich:column>
<h:outputText value="#{broker.name}" />
</rich:column>
<rich:column>
<h:outputText value="#{broker.fractionPrice}" />
</rich:column>
<rich:column>
<h:outputText value="#{broker.lotPrice}" />
</rich:column>
<h:column>
<a4j:commandLink value="alterar" action="#{brokerBean.prepareEdit}" reRender="broker">
<f:setPropertyActionListener value="#{broker}" target="#{brokerBean.currentBroker}"/>
</a4j:commandLink>
</h:column>
<h:column>
<a4j:commandLink value="excluir" reRender="brokerList">
</a4j:commandLink>
</h:column>
</rich:dataTable>
Agora do Bean:
public List<Broker> getBrokers() {
try {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
BrokerDAO brokerDao = DAOFactory.getInstance().getBrokerDAO();
this.brokers = brokerDao.findAll();
} catch (RuntimeException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Erro ao obter lista de corretoras."));
System.out.println("getBrokers->Erro ao listar as corretoras.");
//e.printStackTrace();
}
return this.brokers;
}
public void save() throws Exception {
System.out.println("BrokerBean.save()");
try {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
BrokerDAO brokerDao = DAOFactory.getInstance().getBrokerDAO();
brokerDao.save(currentBroker);
session.getTransaction().commit();
} catch (RuntimeException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Erro ao persistir a Corretora."));
System.out.println("getBrokers->Erro ao persistir a Corretora.");
//e.printStackTrace();
}
currentBroker = new Broker();
this.state = ScreenState.LIST;
}
Agradeço a quem puder ajudar!
Outra coisa: Escrevi o nome do usuário errado... como faço pra consertar isso?
um abraço!