Vraptor e página de erro personalizada

4 respostas
A

Olá pessoal,

trabalho numa aplicação feita em Vraptor3+hibernate.

Fiz uma página de erro personalizada, mas não funcionou.

erro.jsp (fica dentro de webcontent)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page language="java" isErrorPage="true" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>teste de erros</title>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
</head>
<body>

    <h3>Ocorreu um erro: <%= exception%></h3>  

</body>
</html>

nas views do Vraptor coloquei

<%@ page language="java" import="java.util.*" errorPage="/erro.jsp" %>

simulaei um erro de divisão por zero. Mesmo assim a tela erro apareceu, com:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	...
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	...

root cause

java.lang.ArithmeticException: / by zero
	br.com.blumar.portaldofornecedor.controller.TarifaController.form(TarifaController.java:570)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	...
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	...

1. Onde estou errando ?

sei que também tem a opção de configurar no web.xml. Se não me engano é algo assim:


???
/webcontent/500.jsp

2. em Vaptor qual a melhor opção: configurar a página de erro no jsp ou no web.xml

3. Uso tambem o log4j e gravo tudo num arquivo.
Como faço para gravar o erro captado pela página de erro neste log ?

Abs

4 Respostas

Lucas_Cavalcanti

a melhor opção é configurar a página de erro no web.xml mesmo…

pra logar o erro, vc pode criar um interceptor que faz um try…catch em Exception em volta do stack.next…

daí vc loga a exceção e re-lança ela

A

Oi Lucas,

já está funcionando a página de erros, configurei no web.xml… obrigado.

Criei o interceptador e coloquei o try/catch… mas quando dá erro não exibe a página de erro, e sim uma página em branco.

Abaixo segue o código

@Intercepts
@RequestScoped
public class LogErrosInterceptador implements Interceptor {

public boolean accepts(ResourceMethod method) {
	return true;		
}

public void intercept(InterceptorStack stack, ResourceMethod method,
		Object resourceInstance) throws InterceptionException {

	// código a ser executado antes da lógica		
	// nada
	
	try {
	
    		stack.next(method, resourceInstance); // continua a execução
	
	} catch (Exception e){
		
		StringWriter sw = new StringWriter();
		PrintWriter pw = new PrintWriter(sw);
		e.printStackTrace(pw);
		System.out.print(sw);
		try {
			sw.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		pw.close();		
		
		//TO-DO:aqui enviara e-mail ao administrsdor do sistema contendo o stacktrace
		
	}

	// código a ser executádo depois da lógica
	// nada
}

}

O que fiz de errado ?

(a princípio pensei que fosse erro meu ao usar estas classes para impressao do stacktrace, mas depois tirei tudo do catch e coloquei um simples System.out.println(“teste erro”); mesmo assim a página em branco veio, deveria vir a página de erro)

Abs

Lucas_Cavalcanti

não faça esse log na mão… use alguma biblioteca como o Log4j pra fazer…

Pra funcionar a página de erro, vc tem que fazer algo do tipo:

//na classe
private static Logger logger = LoggerFactory.getLogger(LogErrosInterceptador.class);
//no intercepts
public void intercepts(...) {
    try {
        stack.next(method, instance);
    } catch (Exception e) {
        logger.error("Erro ao executar lógica", e);
        throw new InterceptionException(e);
    }
}

só isso, e configurar o logger, é o suficiente

A

Fiz o que você falou; o sistema que estou fazendo já está funcionando com um log de erros em arquivo.

Para o envio de e-mails de alerta de erro configurei um appender de e-mail que vem no próprio lo4j.

Vlw

Criado 30 de abril de 2010
Ultima resposta 4 de mai. de 2010
Respostas 4
Participantes 2