복붙노트

[SPRING] GWT 서비스 예외 로깅에 대한 유용한 정보

SPRING

GWT 서비스 예외 로깅에 대한 유용한 정보

내 gwt 서비스 레이어에 로깅 시스템을 추가하기로 결정했습니다. 우선 그 레이어에서 던져지는 모든 예외를 기록하고 싶었습니다. 나는 다른 서비스를 호출하는 Spring의 ServletDispatcher와 비슷한 객체를 가졌다. 거기에 로깅을 추가 할 수 있다고 생각했지만 GWT 서비스가 ServletResponse에서 검사 예외를 래핑하고 UnexpectedException에 선택 취소 된 것을 알았습니다.

아무도 그 문제에 대해 자신의 경험을 이야기 할 수 있습니까? 모든 GWT 서비스에 대해 체크 된 예외와 체크되지 않은 예외를 기록하는 가장 좋은 방법은 무엇입니까?

RemoteServiceServlet을 확장하고 기본 예외 흐름을 재정의 할 것을 제안하는 솔루션을 찾았습니다. 그러나 나는이 해결책이 너무 많은 시간을 소비한다는 것을 안다. anybode가 더 쉬운 변형을 알고 있습니까?

해결법

  1. ==============================

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

    2.어떤 예외를 기록 하시겠습니까? 클라이언트 측 또는 서버 측? 우리는 gwt로 큰 엔터프라이즈 애플리케이션을 가지고 있습니다. 우리는 클라이언트에서 MVP 패턴을 사용하고 서버에 대한 모든 요청은 일반적인 RPCservice 클래스를 사용하여 수행됩니다. 예를 들어 saveUserService = new remoteService ();

    어떤 예외를 기록 하시겠습니까? 클라이언트 측 또는 서버 측? 우리는 gwt로 큰 엔터프라이즈 애플리케이션을 가지고 있습니다. 우리는 클라이언트에서 MVP 패턴을 사용하고 서버에 대한 모든 요청은 일반적인 RPCservice 클래스를 사용하여 수행됩니다. 예를 들어 saveUserService = new remoteService ();

    서버 측에서는 SaveUserRequest를 처리하고 명령 패턴을 사용하여 SaveUserResponse를 준비합니다. 모든 예외는 ClientWarningException을 제외하고 거기에서 처리됩니다. ClientWarningException은 좋은 메시지를 표시하는 클라이언트까지 전파됩니다.

    이것은 약간 자세한 정보 일 수 있지만 약 100k loc로 큰 응용 프로그램에서 잘 확장됩니다.

  3. ==============================

    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;
            }
        }
    }
    
  4. from https://stackoverflow.com/questions/4193373/best-practices-for-gwt-services-exceptions-logging by cc-by-sa and MIT license