Customização de paginas de erro no Struts 2

1 resposta
maximiliano.geraldo

Olá Pessoal,

Estou querendo customizar as páginas de erro da minha aplicação que utiliza o Struts 2.
Eu tentei utilizar o global-results em conjunto com o global-exception-mappings, mas não deu certo.

Alguem já fez isso??

Segue o meu struts.xml:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.objectFactory" value="spring" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<constant name="struts.i18n.encoding" value="UTF-8" />
	  
    <package name="palPackage" extends="jcaptcha4struts2-default">
		
		<result-types>
		  	<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>		  	
		</result-types>		
	
		<action name="principal">
            <result name="success" type="tiles">principal</result>
		</action>
		
        <action name="perfilSave" class="br.com.xpto.xxx.frontend.action.PerfilAction" method="save">
        	<interceptor-ref name="fileUpload">
        		<param name="maximumSize">500000</param>
        		<param name="allowedTypes">
        			image/gif,image/jpeg,image/png
        		</param>
        	</interceptor-ref>
        	<interceptor-ref name="basicStack"/>
            <result name="success" type="tiles">perfilList</result>
        </action>        		 
    </package>
       
	<package name="palAdminPackage" namespace="/admin" extends="struts-default">
		
		<result-types>
		  	<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>		  	
		</result-types>			
		
		<global-results>
			<result name="erro_geral2">/admin/erro.jsp</result>
		</global-results>
		
		<global-exception-mappings>
			<exception-mapping exception="java.lang.Exception" result="erro_geral2" />
			<exception-mapping exception="com.microsoft.sqlserver.jdbc.SQLServerException" result="erro_geral2" />
			<exception-mapping exception="org.springframework.transaction.TransactionSystemException" result="erro_geral2" />
			<exception-mapping exception="javax.servlet.ServletException" result="erro_geral2" />						
		</global-exception-mappings>				
    </package>   
      
</struts>

Só para completar, essa aplicação possui um fronted, para o usuário final e um backend, para os administradores.
Eu gostaria de customizar a página de erro diferente para cada um.

Só que, mesmo com as configurações no XML acima, um erro 500 explode com o todo os detalhes na tela.

Utilizando o web.xml, eu até consegui configurar uma pagina de erro… mas somente 1 pagina de erro, igual para o frontend e o backend, mas não era isso que eu queria.

Se alguem puder me ajugar, ficarei muito agradecido.OK

Obrigado,
Abraços,
Max

1 Resposta

maximiliano.geraldo

Pessoal,

Só para completar… pesquisando na net, tentei mais algumas coisas… mas também não deram certo…

Eu criei um ExceptionMappingInterceptor

package br.com.estadao.paladar.backend.action;

import org.apache.log4j.Logger;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.ExceptionHolder;
import com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor;

public class AdminExceptionInterceptor extends ExceptionMappingInterceptor {	
	
	private static final long serialVersionUID = 5019790931831081290L;
	
	private Logger logger = Logger.getRootLogger();

    protected void publishException(ActionInvocation invocation, ExceptionHolder exceptionHolder) {
    	
        try {
        	
        	logger.error("ERRO: "+exceptionHolder.getExceptionStack());
        } catch (Exception e) {
        	logger.error(e, e);
        }        

        super.publishException(invocation, exceptionHolder);
    }

}

Depois disso eu modifiquei o struts.xml:

<interceptors>
			
			<interceptor name="exception" class="br.com.xpto.xxx.backend.action.AdminExceptionInterceptor" />
		
			<interceptor-stack name="adminPalStack">
				<interceptor-ref name="exception" />				
			</interceptor-stack>
			
		</interceptors>

		<default-interceptor-ref name="adminPalStack" />

Quando um erro ocorre estora na tela, eu vejo no log a linha:

Parece que o Stuts não está entendendo que eu quero usar o meu ExceptionMappingInterceptor

Alguma ideia?

Criado 9 de março de 2009
Ultima resposta 9 de mar. de 2009
Respostas 1
Participantes 1