20 de mar. de 2009

Struts 2 - Exception Interceptor

Utilizando o Exception Interceptor você poderá mapear suas exceções por tipo(ex: java.sql.Exception) e usar uma página definida para a exceção correspondente.

Para isso criaremos um  global-result. 

<global-results>
   <result name="error">/jsp/Error.jsp</result>
</global-results>

Mas por que global?
Bem, porque muito provavelmente você queira esse mapeamento disponível  para todas as actions do seu package(lembrando que o package nesse caso é a diretiva do arquivo struts.xml e não o package foo.bar.actions de sua aplicação).

O que faremos agora é associar nosso result com a exceção desejada, como podemos ver no snippet abaixo:

<global-exception-mappings>
   <exception-mapping  exception="java.lang.Exception" result="error"/>
</global-exception-mappings>

Graças a nossa amiga ValueStack ainda podemos exibir mais detalhes sobre a exceção lançada em nosso erro.jsp.

<p>Exception: <s:property value="exception" /></p> 
<p>stack trace: <s:property value="exceptionStack" /></p> 

Mas você pode estar se perguntando, como isso ocorre?

O Exception Interceptor está no topo da pilha de interceptors do Struts 2, isso me traz a tranquilidade de que ele possa manipular as exceções em qualquer fase de invocação da action em questão.
Em outras palavras estando no topo da pilha o Exception Interceptor tem o poder de agir desde os primeiros movimentos da ActionInvocation (preprocessing) até o fim de sua atividade (postprocessing).

Espero que seja de bom proveito ;)