Question

Je suis un peu confus quant à la gestion des erreurs dans Struts2. Je souhaite faire une fois la page centrale où les utilisateurs seront dirigés si une erreur se produit. De plus, quand une erreur survient, je souhaite le consigner, puisque j'utilise log4j, je le consignera sous le nom log.error (e.getMessage (), e);

Cependant, dans ma classe d'actions si j'attrape l'erreur (je mets tout mon code dans try / catch), la page d'erreur centrale / commune ne s'affiche pas. Alors j'ai décidé de ne pas attraper l'erreur, si je ne l'attrape pas, alors la page d'erreur centrale apparaît. Mais maintenant, comment puis-je mettre le message d'erreur / stacktrack dans les journaux?

Après avoir lu ce lien J'ai fait ce qui suit:

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

Selon la configuration ci-dessus, à l'origine, l'erreur est renvoyée dans reports.ReportSelection (mais je ne l'attrape pas là). Le contrôle arrive donc finalement dans com.myErrorClass. Je peux enregistrer les erreurs dans cette classe, mais ma question est de savoir si le message de journalisation est toujours disponible ... puisqu'il a été initialement généré dans des rapports. ReportSelection?

Était-ce utile?

La solution

Une fois que vous l'avez capturé et enregistré, le retranscrivez-vous? Si vous le faites, la gestion des exceptions de la structure devrait s’engager. Votre code de traitement des erreurs devrait ressembler à ceci:

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

Une fois cela mis en place, vous devriez pouvoir revenir à votre approche simplifiée de journalisation et de retransmission dans la classe d'action et à la configuration d'une seule page d'erreur globale.

Autres conseils

Voici comment vous enregistrez les erreurs que vos actions génèrent. Je ne sais pas pourquoi cela n'est pas activé par défaut. Mettez ceci dans votre fichier 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"/>

Vous n'avez pas besoin de blocs try-catch autour de chaque méthode d'action.

Au lieu de cela, vous pouvez également "écraser". la pile d'intercepteurs 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top