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: :wink:](https://www.guj.com.br/images/emoji/twitter/wink.png?v=6)
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