usuario propias por personalizar personalizadas net manejo lanzar excepciones excepcion ejemplos crear creadas asp exception-handling struts2 struts

exception handling - propias - Struts 2: cómo redirigir las excepciones de tipo Exception a una página en particular, pero no manejar una excepción en particular?



personalizar exception c# (1)

Utilice el operador instanceof y vuelva a lanzar la excepción deseada del manejador de excepciones.

Lo logré con un interceptor (aquí es lo que solía probar):

package com.kenmcwilliams.interceptor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; import java.util.logging.Level; import java.util.logging.Logger; public class Rethrower implements Interceptor{ @Override public void destroy() { } @Override public void init() { } @Override public String intercept(ActionInvocation invocation){ System.out.println("Start rethrower!"); String result = "success"; try { result = invocation.invoke(); } catch (Exception ex) { Logger.getLogger(Rethrower.class.getName()).log(Level.SEVERE, null, ex); } Object exception = ActionContext.getContext().getValueStack().findValue("exception"); if (exception instanceof RuntimeException){ System.out.println("DOING RETHROW!"); RuntimeException e = (RuntimeException)exception; throw e; } System.out.println("After rethrower!"); return result; } }

Aquí está el struts.xml (para ahorrar tiempo buscando struts dtd):

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.ui.theme" value="simple" /> <package name="kenmcwilliams" namespace="/" extends="struts-default"> <interceptors> <interceptor name="rethrower" class="com.kenmcwilliams.interceptor.Rethrower"/> <interceptor-stack name="rethrow-stack"> <interceptor-ref name="rethrower"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <global-results> <result name="error" >/WEB-INF/content/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error"/> </global-exception-mappings> <action name="mybomb" class="com.kenmcwilliams.kensocketchat.action.Bomb"> <interceptor-ref name="rethrow-stack"/> <result>/WEB-INF/content/bomb.jsp</result> </action> </package> </struts>

Finalmente, la acción (solo arroja una excepción de tiempo de ejecución):

package com.kenmcwilliams.kensocketchat.action; import com.opensymphony.xwork2.ActionSupport; public class Bomb extends ActionSupport{ @Override public String execute() throws Exception{ throw new RuntimeException(); } }

Deseo redirigir todos los errores de tipo Exception al resultado " error ". Para eso, hice esto:

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

Pero no quiero manejar una excepción particular, específicamente la org.springframework.security.access.AccessDeniedException que se le debería permitir propagar más. ¿Cómo puedo lograr eso?