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