Contentor de Erros - Vraptor

8 respostas
robertouba

Bom dia, tudo bem galera!?

Estou fazendo um contentor de Erros, para receber em meu e-mail através de um Interceptor.
Em ColdFusion temos um sistema que analisa qualquer objeto em sua estrutura, e gostaria de saber como receber isso, como pegar essas informações:

Exemplo:
Se no método AdicionarCliente(Cliente cliente){} der um erro, quero ter o Erro com todas as informações, e quero ter as informações que estão contidas no cliente.

Como poderia fazer desta maneira?

8 Respostas

G

Configura o loggin do vraptor para usar o Log4J. Para isso basta colocar as libs que estão no projeto:

log4j-1.2.16.jar
slf4j-log4j12-1.6.1.jar

Depois basta configurar um appender de email no log4j: https://encrypted.google.com/search?q=log4j+smtp+appender

robertouba

Obrigado Garcia,
Mas mesmo assim eu não conseguiria saber todos os dados do objeto que se passa para o método, concorda?

Preciso entender o que o meu cliente digitou de errado, em caso de erros!

Se não me engano estas duas libs estão inclusas no VRator.

G

robertouba:
Obrigado Garcia,
Mas mesmo assim eu não conseguiria saber todos os dados do objeto que se passa para o método, concorda?

Preciso entender o que o meu cliente digitou de errado, em caso de erros!

Se não me engano estas duas libs estão inclusas no VRator.

Não concordo. Log é log sempre, não importa qual appender. Você pode escrever o que quiser lá dentro. Pode ser como no meu exemplo onde coloco uma String fixa e outro com o nome do cliente. No teu caso você pode colocar mais informações, e quem sabe até um dump do objeto através do BeanUtils. Só tenha cuidado para não fazer dump de senhas e outras informações sigilosas.

logger.info(“Bolinha”);
logger.info(“Erro ao incluir cliente {}”, cliente.getNome());

robertouba

Bom essa parte eu imaginei…
Por exemplo, digamos que o cliente tenha digitado Virgula(",") em vez de Ponto(".")no campo de saldo (suponhamos que eu não trate essas coisas no client-side ou no server-side) então quando for para o banco retornará erro, com a mensagem do banco eu sei que tenho um erro, claro, porém eu gostaria de saber a estrutura total de um determinado objeto.
Obtendo um retorno para este erro parecido

Cliente.nome = O nome digitado;

Cliente.saldo = 145.56;

Cliente.Endereco.Rua = Rua do Cliente;

Contudo não tenho informações de qual classe estou a receber, para poder fazer um Log com “template” digamos assim.

robertouba

Não sei se ficou totalmente "BOM"
Mas estou indo por este caminho;

package br.com.rhfactor.quimiflex.interceptors;

import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.rhfactor.funcoes.SendMail;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

@Intercepts
@RequestScoped
public class ContentorErroInterceptor implements Interceptor{

    private final HttpServletRequest request;
    private final Result result;

    public ContentorErroInterceptor(HttpServletRequest request, Result result) {
	super();
	this.request = request;
	this.result = result;
    }

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

    @Override
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
	XStream xstream = new XStream(new DomDriver());
	try {
	    stack.next(method, resourceInstance);
	} catch (Exception e) {
	    String xmlException = xstream.toXML(e);
	    String email = "";
	    email += "<table>";
	    email += "<tr><td>Metodo:<td><td><pre>" + method.getClass() + " | " + method.getMethod() + " | " + this.request.getMethod()
		    + "</pre></td></tr>";
	    email += "<tr><td>IP:<td><td><pre>" + this.request.getRemoteUser() + "</pre></td></tr>";
	    email += "<tr><td>URL:<td><td><pre>" + this.request.getRequestURI() + "</pre></td></tr>";
	    email += "<tr><td>Erro:<td><td><pre>" + xmlException + "</pre></td></tr>";
	    Class<?>[] parameterTypes = method.getMethod().getParameterTypes();
	    for (Class<?> p : parameterTypes) {
		xstream.alias(p.getSimpleName(), p.getClass());
		String r = xstream.toXML(p.getSimpleName());
		email += "<tr><td>Objeto passado: " + p.getCanonicalName() + "<td><td><pre>" + r + "</pre></td></tr>";
	    }
	    email += "</table>";
	    SendMail sm = new SendMail();
	    sm.sendMail("[email removido]", "[email removido]", "Erro Execução", email);
	}
	// this.result.redirectTo(UsuarioController.class).index();
    }

}
Lucas_Cavalcanti

Só cuidado pra fazer esse envio de emails de forma assíncrona, senão o cara além de receber o erro 500 vai ter que ficar esperando o email ser enviado.

Não sei se vc percebeu mas vc está transformando em xml o nome da classe dos parâmetros :wink:

se vc quer os parâmetros reais, receba um MethodInfo no construtor e use info.getParameters()

robertouba

Obrigado Lucas, vou alterar
Geralmente eu trato todos os erros, apenas quero esse erro para coisas que eu não tratei, ou talvez fosse melhor mesmo que eu tirasse os tratamentos e deixassem todos acima.
Em coldFusion temos uma tag chamada <CFDUMP VAR="#variavel#">, ele simplesmente escreve em table todas as informações desta variável, erro, e etc… fica realmente muito bom para ler, e com informações completas tanto de erro, quanto do objeto.

Vou editar o código e postar.

robertouba

Finalizando, conforme o Lucas me dissera:

package br.com.rhfactor.quimiflex.interceptors;

import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.core.MethodInfo;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.rhfactor.funcoes.SendMail;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

@Intercepts
@RequestScoped
public class ContentorErroInterceptor implements Interceptor{

    private final HttpServletRequest request;
    private final Result result;
    private final MethodInfo methodInfo;

    public ContentorErroInterceptor(HttpServletRequest request, Result result, MethodInfo methodInfo) {
	super();
	this.request = request;
	this.result = result;
	this.methodInfo = methodInfo;
    }

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

    @Override
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
	XStream xstream = new XStream(new DomDriver());
	stack.next(method, resourceInstance);
	try {
	    stack.next(method, resourceInstance);
	} catch (Exception e) {
	    String xmlException = xstream.toXML(e);
	    String xmlMethod = xstream.toXML(this.methodInfo);
	    String email = "";
	    email += "&lt;table&gt;";
	    email += "&lt;tr&gt;&lt;td&gt;Metodo:&lt;td&gt;&lt;td&gt;&lt;pre&gt;" + method.getClass() + " | " + method.getMethod() + " | " + this.request.getMethod()
		    + "&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;";
	    email += "&lt;tr&gt;&lt;td&gt;IP:&lt;td&gt;&lt;td&gt;&lt;pre&gt;" + this.request.getRemoteUser() + "&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;";
	    email += "&lt;tr&gt;&lt;td&gt;URL:&lt;td&gt;&lt;td&gt;&lt;pre&gt;" + this.request.getRequestURI() + "&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;";
	    email += "&lt;tr&gt;&lt;td&gt;Erro:&lt;td&gt;&lt;td&gt;&lt;pre&gt;" + xmlException + "&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;";
	    email += "&lt;tr&gt;&lt;td&gt;Dados:&lt;td&gt;&lt;td&gt;&lt;pre&gt;" + xmlMethod + "&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;";
	    email += "&lt;/table&gt;";
	    SendMail sm = new SendMail();
	    sm.sendMail("[email removido]", "[email removido]", "Erro Execução", email);
	}
	// this.result.redirectTo(stack.getClass()).index();
    }
}
Criado 20 de março de 2012
Ultima resposta 22 de mar. de 2012
Respostas 8
Participantes 3