Pregunta

Estoy un poco confundido sobre cómo manejar errores en Struts2. Deseo hacer una vez una página central donde los usuarios serán dirigidos si ocurre un error. Además, cuando ocurre un error, deseo registrarlo, ya que estoy usando log4j lo registraré como log.error (e.getMessage (), e);

Sin embargo, en mi clase de acción si capto el error (pongo todo mi código en try / catch), la página central / error común no aparece. Así que decidí no detectar el error, si no capturo el error, aparece la página de error central. Pero ahora, ¿cómo pongo el mensaje de error / stacktrack en los registros?

Después de leer este enlace Hice lo siguiente:

   <global-results>
                   <result name="Exception" type="chain">
                      <param name="actionName">ErrorPage</param>
                     <param name="namespace">/error</param>

                   </result>
            </global-results>

            <global-exception-mappings>
                <exception-mapping exception="java.lang.Exception" result="Exception"/>
            </global-exception-mappings>
            <action name="selectionPage" class="reports.ReportSelection">
                <result>/reports/SelectionPage.jsp</result>
            </action>

    </package>
    <package name="secure"  namespace="/error">
        <action name="ErrorPage" class="com.myErrorClass">
            <result>errorpage.jsp</result>
        </action>
    </package>

De acuerdo con la configuración anterior, originalmente el error se genera en los informes. ReportSelection (pero no lo estoy captando allí), por lo que finalmente el control llega a com.myErrorClass. PUEDO registrar los errores en esta clase, pero mi pregunta es si el mensaje de registro aún estará disponible ... ya que originalmente se incluyó en los informes. ¿Informe de selección?

¿Fue útil?

Solución

Después de atraparlo y registrarlo, ¿lo está volviendo a mostrar? Si lo hace, entonces la gestión de excepciones del marco debería entrar en acción. Su código de manejo de errores debería verse más o menos así:

catch (Exception e) {
    log.error(e.getMessage(), e);
    throw e;
}

Con eso en su lugar, debería poder volver a su enfoque simplificado de iniciar sesión y volver a mostrarlo en la clase de acción, y configurar una sola página de error global.

Otros consejos

Así es como registra los errores que arrojan sus acciones. No sé por qué esto no está activado de forma predeterminada. Pon esto en tu archivo struts.xml.

    <interceptors>
        <interceptor-stack name="errorloggingStack">
          <interceptor-ref name="defaultStack">
           <param name="exception.logEnabled">true</param>
           <param name="exception.logLevel">ERROR</param>
         </interceptor-ref>
        </interceptor-stack>
    </interceptors>

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

No necesita tener bloques try-catch alrededor de cada método de acción.

Como alternativa, también puede "sobrescribir" la pila de interceptor defaultStack

<interceptors>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="exception">
            <param name="logEnabled">true</param>
            <param name="logLevel">WARN</param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top