Domanda

Sono un po 'confuso su come gestire gli errori in Struts2. Desidero creare una pagina centrale in cui gli utenti verranno indirizzati in caso di errore. Inoltre, quando si verifica un errore, desidero registrarlo, poiché sto usando log4j, lo registrerò come log.error (e.getMessage (), e);

Tuttavia, nella mia classe di azioni se rilevo l'errore (metto tutto il mio codice in try / catch), la pagina di errore centrale / comune non viene visualizzata. Quindi ho deciso di non rilevare l'errore, se non rilevo l'errore viene visualizzata la pagina di errore centrale. Ma ora come posso inserire il messaggio di errore / stacktrack nei log ??

Dopo aver letto questo link Ho fatto quanto segue:

   <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>

Secondo la configurazione precedente, in origine l'errore veniva generato in reports.ReportSelection (ma non lo sto rilevando lì), quindi finalmente il controllo arriva a com.myErrorClass. POSSO registrare gli errori in questa classe, ma la mia domanda è se il messaggio di registro sia ancora disponibile ... poiché è stato originariamente generato nei report. ReportSelection?

È stato utile?

Soluzione

Dopo averlo catturato e registrato, lo stai riproponendo? In tal caso, la gestione delle eccezioni del framework dovrebbe attivarsi. Il codice di gestione degli errori dovrebbe essere simile a:

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

Con questo in atto dovresti essere in grado di tornare al tuo approccio semplificato di registrazione e riprogrammarlo nella classe di azione e configurare una singola pagina di errore globale.

Altri suggerimenti

Ecco come si registrano gli errori generati dalle proprie azioni. Non so perché questo non sia attivato per impostazione predefinita. Inseriscilo nel tuo file 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"/>

Non è necessario disporre di blocchi try-catch attorno a ogni metodo di azione.

In alternativa, puoi anche " sovrascrivere " lo stack intercettore 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top