JSF comportando de forma errada

1 resposta
Psycopata

Olá gente!

Então, pela especificação do JSF, quando uma página apresenta erros, o JSF deve renderizar o último estado válido, ok?
Está acontecendo o seguinte aqui comigo: uma página JSF possui um erro no finzinho da página, então, ao invés do JSF não renderizar essa página com erro, ele rendereza até o erro. Quando chega no erro, ou ele cospe uma mensagem na tela, ou ele simplesmente pára de renderizar.

Eu preciso resolver isso, pq caso ocorra algum erro no JSF (seja programático ou de runtime), eu preciso que o JSF não imprima a tela, ou exiba uma mensagem. Do jeito que está, além da renderização errada, o JSF estraga toda a minha interface.

Bom, a minha estratégia foi ir la no fundo, na classe Lifecycle. Mas ainda não obtive sucesso. A minha idéia é impedir a renderização caso o ciclo de vida do JSF tenha alguma exceção.

Eu interceptei o método render, do contexto do JSF. Esse método executa o ciclo de vida do JSF e renderiza na tela. Mas o problema é que ele está cuspindo coisas mesmo com erros, e eu não estou achando o local que eu posso interferir e evitar que o JSF imprima telas com erros de JSF.

Alguém já teve esse problema? Como resolveu?

1 Resposta

warley

Olá Psycopata.

Seguinte… eu uso o JSF a + ou - 1 ano e ainda não tive este problema.

Para tratamento de erros vc pode usar a tag <h:messages>. Veja:

&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %&gt;
&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %&gt;
&lt;f:view&gt;
 &lt;html&gt;
   &lt;body&gt;
     &lt;h:form &gt;Enter name and password below :<br>
          &lt;h:inputText id="name" required="true" value="#{MessageBean.a}" /&gt;<br><br>
          &lt;h:inputSecret id="pwd" required="true" value="#{MessageBean.b}" /&gt;<br>
          &lt;h:commandButton id="submit" value="Submit"/&gt;<br />
          &lt;h:messages showDetail="false" showSummary="true" layout="table"/&gt;
     &lt;/h:form&gt;
   &lt;/body&gt;
 &lt;/html&gt;
&lt;/f:view&gt;

Assim qualquer erro que acontece na sua tela a mensagem vai aparecer na tag.
Como sugestão vc pode colocar nos seus Beans o tratamento de erro deste forma:

try{
            
            //Obtem os valores da sigla da área
            listaSiglasAreas = this.montaSelectSiglaArea(codigoEmpresa, codigoEstrutural);
            
            
            bundle = ResourceBundle.getBundle("com.rh.gestaodesempenho.resources.ApplicationResources", context.getViewRoot().getLocale());
            listaEquipes = services.findEquipes(to);
            if(listaEquipes.size() != 0){
                String msg = bundle.getString("geral.informacao.registrosencontrados");
                MessageFormat format = new MessageFormat(msg);
                Object[] parametros = {listaEquipes.size()};
                
                mensagem = new FacesMessage(format.format(parametros));
                mensagem.setSeverity(FacesMessage.SEVERITY_INFO);
                context.addMessage (null, mensagem);
            }
            else{
                String msg = bundle.getString("geral.informacao.registronaoencontrados");
                mensagem = new FacesMessage(msg);
                mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
                context.addMessage (null, mensagem);
            }
            
            
        }
        catch (Exception e){           
        
            if (logger.isDebugEnabled()) {
                logger.debug("Class Equipe method: [actionExibirEquipes] Erro: "+ e.getMessage());
            }
        
            FacesMessage mensagem = new FacesMessage( e.getMessage());
            mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage (null, mensagem);
        }

Trate o erro e coloque as mensagem nos objetos da classe FacesMessage.

É isto. haaa… uma outra sugestão. Use o RichFaces. Trabalhar com JSF em um bom framework é muito complicado! :wink:

Abraço…

Criado 4 de março de 2010
Ultima resposta 4 de mar. de 2010
Respostas 1
Participantes 2