Customizar erros em JSF

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:

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).

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.,

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”.

[code]
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);
}[/code]

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

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).

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..."); }

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 =)

[code]
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();
	}
}

}[/code]

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