Customizar erros em JSF

6 respostas
J

olá,

estou desenvolvendo uma app em jsf… e gostaria de saber como faço para customizar os erros vindo do controller…

exemplo… erro vindo do hibernate… tipo um ConstraintViolationException…

tentei inserir uma chave duplicada e recebi um ConstraintViolationException… porem isto vai pra uma pagina de erro… td feio e sinistro :shock:

gostaria de escrever algo mais bunitinho… tipo um “Voce tentou gravar um registro que ja existe”…
algo assim… de preferencia no proprio formulario q o cidadão esta inserindo os dados…

alguem? :wink:

6 Respostas

F

jeferson, leia sobre o tratamento de exceções.


depois de tratada, vc decide a melhor forma de exibir o erro para o usuário.
também estou desenvolvendo em JSF e exibo a msg de erro num modal panel (richfaces).

J

olá finotti,

tratar a exeção e tranquilo… estudei muito sobre isso pra certificação =)

talvez e me expliquei mal…

o problema e apresentar a exceção para o usuario… tipo não queria criar uma pagina de erro para cada exception lançada… e tambem não queria criar uma por codigo de erro (tipo 500)…

entendeu?

como vc faz para exibir em um modal Panel?

a validação do Jsf eu uso assim:

<h:outputText value="Quantidade aproximada de resíduo:" styleClass="label"/>

<h:inputText label="Quantidade aproximada de resíduo" id="qtdeRes" required="true" 
value="#{propostaHandler.proposta.qtdeResiduo}" >
   <rich:ajaxValidator event="onblur"/>
</h:inputText>

<rich:message for="qtdeRes">
   <f:facet name="passedMarker">
      <h:graphicImage  value="/recursos/imagens/passed.gif" /> 
   </f:facet>
   <f:facet name="errorMarker">
      <h:graphicImage value="/recursos/imagens/error.gif" />   
   </f:facet>
</rich:message>

agora queria uma forma elegante de exibir as exception do controller!!!

at.,

F

opa, realmente te entendi mal :lol:

para o controller, criei uma classe utilitária que envia mensagens para a tela. não sei se é o que vc procura, mas pode servir de "idéia".

public static void exibirMsgSucesso(String detail) {
		String summary = resourceBundle.getString("Sucesso");
		exibirMsg(summary, detail, FacesMessage.SEVERITY_INFO);
	}

	public static void exibirMsgErro(String detail) {
		String summary = resourceBundle.getString("Erro");
		exibirMsg(summary, detail, FacesMessage.SEVERITY_ERROR);
	}

	private static void exibirMsg(String summary, String detail, FacesMessage.Severity severity) {
		FacesMessage facesMessage = new FacesMessage(severity, summary, detail);
		FacesContext.getCurrentInstance().addMessage(null, facesMessage);
	}

na página, vc exibe as mensagens do jeito que preferir

J

Como você já sabe tratar as exceptions, você pode simplesmente adicionar os valores no FacesMessage (do FacesContext) e apresentá-lo no JSF com o rich:messages. Porém se você quer algo mais customizado, aconselho criar um componente para mostrar as mensagens de erro (eu trabalho assim e funciona muito bem).

Aqui vai um tutorial de como criar um componente de JSF + Facelets: http://www.jairrillo.com/blog/2009/07/09/how-to-create-custom-jsf-facelets-component/ (caso você não use Facelets, o procedimento para criar um componente JSF difere um pouquinho).

F

complementando…
no seu controller, vc utilizaria essa classe em caso de exceção

try { //grava no banco } catch (ConstraintViolationException ex) { ClasseUtil.exibirMsgErro("Voce tentou gravar um registro que ja existe..."); }

J

pow galera!!! gostei das ideias =)

eu tenho um filtro... portanto vou tratar as exception nele... pelo menos as mais comuns... deem uma olhada ja coloquei as padrão, agora e so acrescentar as q eu preciso =)
public class HibernateSessionFilter implements Filter {

	private static Logger logger;
    static{logger = Logger.getLogger("br.com.corpus.appLogger");}
    
    @Override
	public void init(FilterConfig arg0) throws ServletException {

	}
    
	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain fc) throws IOException, ServletException {
		
		logger.info("Filtering...");
		HibernateUtil.openSession();
		
		try{
			logger.info("Getting Transaction.");
			HibernateUtil.getCurrentSession().beginTransaction();
			
			fc.doFilter(req, res);
			
			logger.info("Commit Transaction.");
			HibernateUtil.getCurrentSession().getTransaction().commit();
			
		}catch (IOException e) {
			logger.error("Erro...",e);	
			executeRollBack();
			
			// aqui vou chamar minha util de Msg =)
			
		}catch (ServletException e) {
			logger.error("Erro...",e);
			executeRollBack();
			
			// aqui vou chamar minha util de Msg =)
		
		}catch (Exception e) {
			logger.error("Erro...",e);
			executeRollBack();
			
			//aqui ferrou!!!
			
			throw new ServletException(e);
			
		}finally{
			HibernateUtil.closeCurrentSession();
		}
		

	}

	private void executeRollBack(){
		if(HibernateUtil.getCurrentSession().getTransaction().isActive()){
			logger.info("RollBack Transaction.");
			HibernateUtil.getCurrentSession().getTransaction().rollback();
		}
	}

}

a respeito da tag... posso criar uma Custom Tag mesmo =)
e simples facil e eficiente!!!
daria ate para colocar uns JavaScript na tag e montar uma msg bem legal =)

valeu pelas ideias =)

t+ abraços

Criado 14 de julho de 2009
Ultima resposta 14 de jul. de 2009
Respostas 6
Participantes 3