com.opensymphony.xwork2.interceptor
Class ExceptionMappingInterceptor

java.lang.Object
  extended by com.opensymphony.xwork2.interceptor.AbstractInterceptor
      extended by com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor
All Implemented Interfaces:
Interceptor, java.io.Serializable

public class ExceptionMappingInterceptor
extends AbstractInterceptor

This interceptor forms the core functionality of the exception handling feature. Exception handling allows you to map an exception to a result code, just as if the action returned a result code instead of throwing an unexpected exception. When an exception is encountered, it is wrapped with an ExceptionHolder and pushed on the stack, providing easy access to the exception from within your result. Note: While you can configure exception mapping in your configuration file at any point, the configuration will not have any effect if this interceptor is not in the interceptor stack for your actions. It is recommended that you make this interceptor the first interceptor on the stack, ensuring that it has full access to catch any exception, even those caused by other interceptors.

Interceptor parameters:

The parameters above enables us to log all thrown exceptions with stacktace in our own logfile, and present a friendly webpage (with no stacktrace) to the end user.

Extending the interceptor:

If you want to add custom handling for publishing the Exception, you may override publishException(com.opensymphony.xwork2.ActionInvocation, ExceptionHolder). The default implementation pushes the given ExceptionHolder on value stack. A custom implementation could add additional logging etc.

Example code:

 
 <xwork>
     <package name="default" extends="xwork-default">
         <global-results>
             <result name="error" type="freemarker">error.ftl</result>
         </global-results>

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

         <action name="test">
             <interceptor-ref name="exception"/>
             <interceptor-ref name="basicStack"/>
             <exception-mapping exception="com.acme.CustomException" result="custom_error"/>
             <result name="custom_error">custom_error.ftl</result>
             <result name="success" type="freemarker">test.ftl</result>
         </action>
     </package>
 </xwork>
 
 

This second example will also log the exceptions using our own category com.mycompany.app.unhandled at WARN level.

 
 <xwork>
   <package name="something" extends="xwork-default">
      <interceptors>
          <interceptor-stack name="exceptionmappingStack">
              <interceptor-ref name="exception">
                  <param name="logEnabled">true</param>
                  <param name="logCategory">com.mycompany.app.unhandled</param>
                  <param name="logLevel">WARN</param>                               
              </interceptor-ref>  
              <interceptor-ref name="i18n"/>
              <interceptor-ref name="staticParams"/>
              <interceptor-ref name="params"/>
              <interceptor-ref name="validation">
                  <param name="excludeMethods">input,back,cancel,browse</param>
              </interceptor-ref>
          </interceptor-stack>
      </interceptors>

      <default-interceptor-ref name="exceptionmappingStack"/>
    
      <global-results>
           <result name="unhandledException">/unhandled-exception.jsp</result>
      </global-results>

      <global-exception-mappings>
           <exception-mapping exception="java.lang.Exception" result="unhandledException"/>
      </global-exception-mappings>
        
      <action name="exceptionDemo" class="org.apache.struts2.showcase.exceptionmapping.ExceptionMappingAction">
          <exception-mapping exception="org.apache.struts2.showcase.exceptionmapping.ExceptionMappingException"
                             result="damm"/>
          <result name="input">index.jsp</result>
          <result name="success">success.jsp</result>            
          <result name="damm">damm.jsp</result>
      </action>

   </package>
 </xwork>
 
 

Author:
Matthew E. Porter (matthew dot porter at metissian dot com), Claus Ibsen
See Also:
Serialized Form

Field Summary
protected  Logger categoryLogger
           
protected static Logger LOG
           
protected  java.lang.String logCategory
           
protected  boolean logEnabled
           
protected  java.lang.String logLevel
           
 
Constructor Summary
ExceptionMappingInterceptor()
           
 
Method Summary
protected  void doLog(Logger logger, java.lang.Exception e)
          Performs the actual logging.
protected  java.lang.String findResultFromExceptions(java.util.List<ExceptionMappingConfig> exceptionMappings, java.lang.Throwable t)
           
 int getDepth(java.lang.String exceptionMapping, java.lang.Throwable t)
          Return the depth to the superclass matching.
 java.lang.String getLogCategory()
           
 java.lang.String getLogLevel()
           
protected  void handleLogging(java.lang.Exception e)
          Handles the logging of the exception.
 java.lang.String intercept(ActionInvocation invocation)
          Override to handle interception
 boolean isLogEnabled()
           
protected  void publishException(ActionInvocation invocation, ExceptionHolder exceptionHolder)
          Default implementation to handle ExceptionHolder publishing.
 void setLogCategory(java.lang.String logCatgory)
           
 void setLogEnabled(boolean logEnabled)
           
 void setLogLevel(java.lang.String logLevel)
           
 
Methods inherited from class com.opensymphony.xwork2.interceptor.AbstractInterceptor
destroy, init
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

LOG

protected static final Logger LOG

categoryLogger

protected Logger categoryLogger

logEnabled

protected boolean logEnabled

logCategory

protected java.lang.String logCategory

logLevel

protected java.lang.String logLevel
Constructor Detail

ExceptionMappingInterceptor

public ExceptionMappingInterceptor()
Method Detail

isLogEnabled

public boolean isLogEnabled()

setLogEnabled

public void setLogEnabled(boolean logEnabled)

getLogCategory

public java.lang.String getLogCategory()

setLogCategory

public void setLogCategory(java.lang.String logCatgory)

getLogLevel

public java.lang.String getLogLevel()

setLogLevel

public void setLogLevel(java.lang.String logLevel)

intercept

public java.lang.String intercept(ActionInvocation invocation)
                           throws java.lang.Exception
Description copied from class: AbstractInterceptor
Override to handle interception

Specified by:
intercept in interface Interceptor
Specified by:
intercept in class AbstractInterceptor
Parameters:
invocation - the action invocation
Returns:
the return code, either returned from ActionInvocation.invoke(), or from the interceptor itself.
Throws:
java.lang.Exception - any system-level error, as defined in Action.execute().

handleLogging

protected void handleLogging(java.lang.Exception e)
Handles the logging of the exception.

Parameters:
e - the exception to log.

doLog

protected void doLog(Logger logger,
                     java.lang.Exception e)
Performs the actual logging.

Parameters:
logger - the provided logger to use.
e - the exception to log.

findResultFromExceptions

protected java.lang.String findResultFromExceptions(java.util.List<ExceptionMappingConfig> exceptionMappings,
                                                    java.lang.Throwable t)

getDepth

public int getDepth(java.lang.String exceptionMapping,
                    java.lang.Throwable t)
Return the depth to the superclass matching. 0 means ex matches exactly. Returns -1 if there's no match. Otherwise, returns depth. Lowest depth wins.

Parameters:
exceptionMapping - the mapping classname
t - the cause
Returns:
the depth, if not found -1 is returned.

publishException

protected void publishException(ActionInvocation invocation,
                                ExceptionHolder exceptionHolder)
Default implementation to handle ExceptionHolder publishing. Pushes given ExceptionHolder on the stack. Subclasses may override this to customize publishing.

Parameters:
invocation - The invocation to publish Exception for.
exceptionHolder - The exceptionHolder wrapping the Exception to publish.


Copyright © 2000-2011 Apache Software Foundation. All Rights Reserved.