Pergunta

Estou um pouco confuso sobre a forma de tratamento de erros em Struts2. Quero fazer uma vez página central onde os usuários serão direcionados se ocorrer um erro. Além disso, quando ocorre um erro eu gostaria de registrá-la, desde que eu estou usando log4j eu vou estar registrando-o como log.error(e.getMessage(), e);

No entanto, na minha classe de ação se eu pegar o erro (colocar todo o meu código em try / catch), em seguida, a página de erro Central / comum não vir para cima. Então eu decidi contra captura o erro, se eu não pegar o erro, em seguida, página de erro Central vem à tona. Mas agora como faço para colocar a mensagem de erro / stacktrack na toras ??

Depois de ler este ligação Eu fiz o seguinte:

   <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 acordo com a configuração acima, originalmente o erro é lançado em reports.ReportSelection (mas não estou pegando-o há) para que, finalmente, o controle vem para com.myErrorClass. Eu posso entrar os erros nesta classe, mas a minha pergunta é, se a mensagem de log ainda estar disponível ... desde que foi originalmente lançado em reports.ReportSelection?

Foi útil?

Solução

Depois de pegar e log-lo, você está retrhowing isso? Se o fizer, então o gerenciamento de exceções quadro deve chutar seu manipulação de erro de código deve ser algo como:.

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

Com isso no lugar que você deve ser capaz de voltar para a sua abordagem simplificada de registro e retrhowing-lo na classe de ação, e configurar uma única página de erro global.

Outras dicas

Aqui está como você registrar erros que suas ações jogar. Eu não sei por que isso não está ativado por padrão. Colocar isso em seu arquivo 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"/>

Você não precisa ter blocos try-catch em torno de cada método de ação.

Como alternativa, você também pode "Substituir" o defaultStack interceptor pilha

<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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top