Mostrar a exception gerada na regra de negocio de Maneira amigavel na página JSF

1 resposta
ekszuki

Bom dia,

Gostaria da ajuda da lista para tirar uma dúvida a respeito de como tratar uma exception gerada dentro de uma regra de negocio e mostra-la de maneira amigavel para o usuário.

Por exemplo.

O usuário informa o código do cliente para ser recuperado no banco de dados atraves do action buscarUsuario que esta dentro do meu Managed-bean.
Quando o usuario existe no banco de dados ele o mostra normalmente na página jsf, mas vamos supor que o código informado não exista no banco de dados.

Eu gostaria de mostrar uma mensagem na página JSF dizendo "Cliente não foi encontrado no banco de dados".

Outro caso.

Um trecho de um Managed-bean para ilustrar a minha dúvida…

public String renovarChave() throws Throwable {
      Criptografia crip = new Criptografia();
      DateFormat df = DateFormat.getDateInstance();
      Query query;
      Licensa licensa = null ;
      try {
         // verifica se esta liberado para gerar chaves
         query = em.createNamedQuery("Liberacao.findAll");
         Liberacao liberacao = (Liberacao) query.getSingleResult();

         if (liberacao.getStatus().equals("N")) {
            throw new Throwable("Sistema bloqueado para renovacao de chaves");
         }

         // find old key in database
         query = em.createNamedQuery("Licensa.findByLicensekey");
         query.setParameter("licensekey", theOldKey);
         licensa = (Licensa) query.getSingleResult();

         Date hoje = new Date() ;
         // verifica se a chave esta vencida
         int diasParaTravar =  Util.dataDiff(hoje, licensa.getDataTrava() ) ;

         // Permiti gerar a nova chave a partir de 10 dias para vencer 
         if( diasParaTravar > 10 ) {
             throw new Throwable("Chave esta dentro do periodo de operação" ) ;   
         }
         String key = crip.Desencripta(theOldKey);

         String hd = key.substring(10, 18);
         Date data = df.parse(key.substring(0, 10));

         Calendar dataProximaTrava = Calendar.getInstance();
         dataProximaTrava.setTime(data);
         dataProximaTrava.add(Calendar.DATE, Dias);

         theNewKey =  crip.Encripta( df.format(dataProximaTrava.getTime()) + hd ) ;

      } catch (ParseException ex) {
         Logger.getLogger(MyKeyManagerBean.class.getName()).log(Level.SEVERE, null, ex);
      }
      return "refresh";
   }

A dúvida é como mostrar de maneira amigavel no JSP a mensagem gerada pelo
throw new Throwable("Sistema bloqueado para renovacao de chaves" ) ;
ou alguma outra exception gerada dentro da regra de negocio do meu managed-bean…

Um trecho da página JSF

<a4j:form ajaxSubmit="true" reRender="painel1" ignoreDupResponses="true">
                  
                  <a4j:outputPanel ajaxRendered="true"><rich:messages /></a4j:outputPanel>
                  <br/>
                  &lt;rich:panel id="painel1" header="Dados para Renovação da Licensa"&gt;

                     &lt;h:outputText value="Chave atual (19 dígitos)" /&gt;
                     <br/>
                     &lt;h:inputText value="#{MyKeyManagerBean.theOldKey}"
                                  size="30"
                                  required="true"
                                  maxlength="19"
                                  validatorMessage="Tamanho da chave atual não é valida"
                                  requiredMessage="Chave atual é obrigatória" &gt;
                        &lt;f:validateLength minimum="19"/&gt;
                     &lt;/h:inputText&gt;
                     <br/>
                     &lt;h:outputText value="Dias de Liberação" /&gt;
                     <br/>
                     &lt;h:inputText value="#{MyKeyManagerBean.dias}"
                                  required="true"
                                  validatorMessage="Quantidade de dias permitidos entre 15 e 90 dias" &gt;
                        &lt;f:validateLongRange minimum="15" maximum="90" /&gt;
                     &lt;/h:inputText&gt;
                     <br/>
                     &lt;h:outputText value="Nova chave gerada:" /&gt;
                     <br/>
                     &lt;h:inputText value="#{MyKeyManagerBean.theNewKey}"
                                  readonly="true"
                                  size="30"/&gt;
                     <br/>
                     <br/>
                     &lt;a4j:commandButton action="#{MyKeyManagerBean.renovarChave}" value="Atualizar Chave" /&gt;
                  &lt;/rich:panel&gt;
               &lt;/a4j:form&gt;

Alguem tem outra ideia de como fazer isso ?

Outra dúvida, estou gerando um throw porque não posso permitir que o resto do código seja executado.

Tambem pensei em fazer o tratamento da exception dentro do meu try/catch, mas como retornar a mensagem no <rick:messages/> de maneira amigavel para o JSF mostrar para o usuário ?

Aguardando sugestões…

T+

1 Resposta

ekszuki

Olá a todos,

consegui resolver o problema de seguinte forma…

no Managed-Bean

public String renovarChave() {
      Criptografia crip = new Criptografia();
      DateFormat df = DateFormat.getDateInstance();
      Query query;
      Licensa licensa = null;
      try {
         // verifica se esta liberado para gerar chaves
         query = em.createNamedQuery("Liberacao.findAll");
         Liberacao liberacao = (Liberacao) query.getSingleResult();

         if (liberacao.getStatus().equals("N")) {
            throw new Throwable("O Sistema está bloqueado para atualizar as chaves" ) ;
         }

         // find old key in database
         query = em.createNamedQuery("Licensa.findByLicensekey");
         query.setParameter("licensekey", theOldKey);
         licensa = (Licensa) query.getSingleResult();

         Date hoje = new Date();
         // verifica se a chave esta vencida
         int diasParaTravar = Util.dataDiff(hoje, licensa.getDataTrava());

         // Permiti gerar a nova chave a partir de 10 dias para vencer 
         if (diasParaTravar &gt; 10) {
            new Throwable("Chave esta dentro do periodo de utilização " ) ;
         }
         String key = crip.Desencripta(theOldKey);

         String hd = key.substring(10, 18);
         Date data = df.parse(key.substring(0, 10));

         Calendar dataProximaTrava = Calendar.getInstance();
         dataProximaTrava.setTime(data);
         dataProximaTrava.add(Calendar.DATE, Dias);

         theNewKey = crip.Encripta(df.format(dataProximaTrava.getTime()) + hd);
      } catch (ParseException ex) {
         Logger.getLogger(MyKeyManagerBean.class.getName()).log(Level.SEVERE, null, ex);
      } catch ( Throwable ex ) {
         FacesContext.getCurrentInstance().addMessage("invalido", new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), "Detail") );
      }
      return "refresh";
   }

adicionei o tratamento no try/catch

} catch ( Throwable ex ) {
         FacesContext.getCurrentInstance().addMessage("invalido", new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), "Detail") );
      }

e adicionei a mensagem diretamente no Contexto

Assim funcionou,

Se alguem tiver uma solução melhor…

Fico no aguardo …

T+

Criado 10 de maio de 2009
Ultima resposta 10 de mai. de 2009
Respostas 1
Participantes 1