문제

Struts2에서 오류 처리 방법에 대해 약간 혼란스러워합니다. 오류가 발생하면 사용자가 지시 될 중앙 페이지를 한 번 만들고 싶습니다. 또한 오류가 발생하면 로그 4J를 사용하고 있기 때문에 로그인하고 싶습니다. log.error(e.getMessage(), e);

그러나 액션 클래스에서 오류를 잡으면 (모든 코드를 시도/캐치에 넣으면) 중앙/공통 오류 페이지가 나타나지 않습니다. 그래서 오류를 잡기로 결정했습니다. 오류를 잡지 않으면 중앙 오류 페이지가 나타납니다. 그러나 이제 오류 메시지/스택 트랙을 로그에 어떻게 넣습니까 ??

이것을 읽은 후 링크나는 다음을했다 :

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

위의 구성에 따르면, 원래 오류는 보고서에 버려집니다. reportSelection (그러나 나는 그것을 포착하지 않습니다). 결국 컨트롤은 com.MyErrorClass에옵니다. 이 클래스의 오류를 기록 할 수는 있지만 내 질문은 로그 메시지를 사용할 수 있는지 여부입니다. 원래 보고서에 던져 졌기 때문에 보고서.

도움이 되었습니까?

해결책

당신이 그것을 잡고 로그인 한 후에, 당신은 그것을 재정의하고 있습니까? 그렇다면 프레임 워크 예외 관리가 시작되어야합니다. 오류 처리 코드는 다음과 같습니다.

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

이를 통해 액션 클래스에서 로깅 및 재전송하는 단순화 된 접근 방식으로 돌아가서 단일 글로벌 오류 페이지를 구성 할 수 있어야합니다.

다른 팁

동작이 던지는 오류를 기록하는 방법은 다음과 같습니다. 왜 이것이 기본적으로 켜지지 않았는지 모르겠습니다. 이것을 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"/>

모든 동작 방법에 대한 시도 블록이 필요하지 않습니다.

대안으로 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top