[SPRING] GWT 서비스 예외 로깅에 대한 유용한 정보
SPRINGGWT 서비스 예외 로깅에 대한 유용한 정보
내 gwt 서비스 레이어에 로깅 시스템을 추가하기로 결정했습니다. 우선 그 레이어에서 던져지는 모든 예외를 기록하고 싶었습니다. 나는 다른 서비스를 호출하는 Spring의 ServletDispatcher와 비슷한 객체를 가졌다. 거기에 로깅을 추가 할 수 있다고 생각했지만 GWT 서비스가 ServletResponse에서 검사 예외를 래핑하고 UnexpectedException에 선택 취소 된 것을 알았습니다.
아무도 그 문제에 대해 자신의 경험을 이야기 할 수 있습니까? 모든 GWT 서비스에 대해 체크 된 예외와 체크되지 않은 예외를 기록하는 가장 좋은 방법은 무엇입니까?
RemoteServiceServlet을 확장하고 기본 예외 흐름을 재정의 할 것을 제안하는 솔루션을 찾았습니다. 그러나 나는이 해결책이 너무 많은 시간을 소비한다는 것을 안다. anybode가 더 쉬운 변형을 알고 있습니까?
해결법
-
==============================
1.서버 측에는 모든 서비스 구현에 사용되는 RemoteServiceServlet의 하위 클래스가 있습니다. 시간이 오래 걸리는 것처럼 보일 지 모르지만 여기에 코드가 어떻게 생겼는지 설명합니다. 당신은 한 번 해봐야 끝납니다.
서버 측에는 모든 서비스 구현에 사용되는 RemoteServiceServlet의 하위 클래스가 있습니다. 시간이 오래 걸리는 것처럼 보일 지 모르지만 여기에 코드가 어떻게 생겼는지 설명합니다. 당신은 한 번 해봐야 끝납니다.
@Override protected void doUnexpectedFailure(Throwable t) { t.printStackTrace(System.err); super.doUnexpectedFailure(t); }
참고 : 실제로 System.err로 보내지는 않겠지 만 그 중 하나는 안됩니다.하지만 아이디어를 얻으실 수 있습니다.
클라이언트 측에서는 AsyncCallback AsyncSuccessCallback이라는 하위 클래스를 사용합니다. 대부분의 RPC 호출에 대해 onFailure 케이스를 균일하게 처리합니다. 대부분의 콜백 코드는 onSuccess 사례를 처리 할 수 있으며 onFailure가 처리된다는 것을 알고 있습니다. 또한 나중에이 구현을 변경할 수있는 단일 장소를 제공합니다.
public abstract class AsyncSuccessCallback<T> implements AsyncCallback<T> { public void onFailure(Throwable t) { handleException(t); } protected void handleException(Throwable t) { Window.alert(t.getMessage()); } }
참고 : 실제로 Window.alert를 사용하지는 않지만 다시 아이디어를 얻습니다. 이 경우 우리가 수행하는 작업은 오류 보고서를 받아들이는 다른 서버에 POST를 수행하는 양식을 표시하는 GWT DialogBox를 표시하는 것입니다. 양식을 사용하면 오류가 발생할 때 사용자가 수행 한 작업에 대한 설명을 입력 할 수 있습니다.
클라이언트 측에서 스택 추적을 얻으려면 약간의 코드를 작성해야합니다.
// for lineEnding, use "<br>" for HTML, "\n" for text public static final String getStackTrace(Throwable t, String lineEnding) { Object[] stackTrace = t.getStackTrace(); if (stackTrace != null) { StringBuilder output = new StringBuilder(); for (Object line : stackTrace) { output.append(line); output.append(lineEnding); } return output.toString(); } else { return "[stack unavailable]"; } }
-
==============================
2.어떤 예외를 기록 하시겠습니까? 클라이언트 측 또는 서버 측? 우리는 gwt로 큰 엔터프라이즈 애플리케이션을 가지고 있습니다. 우리는 클라이언트에서 MVP 패턴을 사용하고 서버에 대한 모든 요청은 일반적인 RPCservice 클래스를 사용하여 수행됩니다. 예를 들어 saveUserService = new remoteService ();
어떤 예외를 기록 하시겠습니까? 클라이언트 측 또는 서버 측? 우리는 gwt로 큰 엔터프라이즈 애플리케이션을 가지고 있습니다. 우리는 클라이언트에서 MVP 패턴을 사용하고 서버에 대한 모든 요청은 일반적인 RPCservice 클래스를 사용하여 수행됩니다. 예를 들어 saveUserService = new remoteService ();
서버 측에서는 SaveUserRequest를 처리하고 명령 패턴을 사용하여 SaveUserResponse를 준비합니다. 모든 예외는 ClientWarningException을 제외하고 거기에서 처리됩니다. ClientWarningException은 좋은 메시지를 표시하는 클라이언트까지 전파됩니다.
이것은 약간 자세한 정보 일 수 있지만 약 100k loc로 큰 응용 프로그램에서 잘 확장됩니다.
-
==============================
3.gwt-dispatch를 사용하십시오. gwt-dispatch 시작하기 페이지에서 해제 한 다음 샘플에서 볼 수 있듯이 로깅을 표준 디스패치 서비스에 포함시킬 수 있습니다.
gwt-dispatch를 사용하십시오. gwt-dispatch 시작하기 페이지에서 해제 한 다음 샘플에서 볼 수 있듯이 로깅을 표준 디스패치 서비스에 포함시킬 수 있습니다.
public class SimpleDispatchServlet extends RemoteServiceServlet implements StandardDispatchService { private Dispatch dispatch; public SimpleDispatchServlet() { InstanceActionHandlerRegistry registry = new DefaultActionHandlerRegistry(); registry.addHandler(new IncrementCounterHandler()); dispatch = new SimpleDispatch(registry); } public Result execute(Action<?> action) throws DispatchException { try { return dispatch.execute(action); } catch (RuntimeException e) { log("Exception while executing " + action.getClass().getName() + ": " + e.getMessage(), e ); throw e; } } }
from https://stackoverflow.com/questions/4193373/best-practices-for-gwt-services-exceptions-logging by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3.1 사용자 정의 제약 조건 유효성 검사기에서 자동 와이어 링이 작동하지 않습니다. (0) | 2019.03.16 |
---|---|
[SPRING] Spring 기반 Java 애플리케이션에서 단일 실행 가능 JAR 작성 (0) | 2019.03.16 |
[SPRING] 스프링 보안과 함께 여러 개의 보안 컨텍스트를 가질 수 있습니까? (0) | 2019.03.16 |
[SPRING] Maven 프로젝트 용 애플리케이션 설정 파일은 어디에 두어야하나요? (0) | 2019.03.16 |
[SPRING] Spring Boot Maven Plugin을 사용할 때 jar 파일에서 Spring Boot 애플리케이션의 자원이 누락된다. (0) | 2019.03.16 |