2010-11-16 32 views
9

Tôi quyết định thêm hệ thống ghi nhật ký vào lớp dịch vụ gwt của mình. Trước hết tôi muốn đăng nhập tất cả các ngoại lệ được ném từ lớp đó. Tôi đã có một đối tượng tương tự như ServletDispatcher của Spring, gọi các dịch vụ khác. Tôi nghĩ rằng tôi có thể thêm đăng nhập ở đó, nhưng tôi nhận ra rằng các dịch vụ GWT kết thúc tốt đẹp các ngoại lệ đã kiểm tra trong ServletResponse và bỏ chọn vào UnexpectedException.Thực tiễn tốt nhất cho các dịch vụ GWT ngoại lệ ghi nhật ký

Ai có thể chia sẻ trải nghiệm của mình với vấn đề đó không? Cách tốt nhất để ghi lại các ngoại lệ đã chọn và không được kiểm tra cho tất cả các Dịch vụ GWT là gì.


tôi tìm thấy giải pháp mà gợi ý để mở rộng ngoại lệ RemoteServiceServlet và ghi đè mặc định chảy. Nhưng tôi thấy giải pháp này quá tốn thời gian. Có anybode biết bất kỳ biến thể dễ dàng hơn?

Trả lời

12

Ở phía máy chủ, chúng tôi có một lớp con của RemoteServiceServlet mà chúng tôi sử dụng cho tất cả các triển khai dịch vụ. Bạn đề cập đến rằng nó có vẻ tốn thời gian, nhưng đây là những gì mã trông giống như. Bạn làm điều đó một lần và bạn đã hoàn tất.

@Override 
protected void doUnexpectedFailure(Throwable t) { 
    t.printStackTrace(System.err); 
    super.doUnexpectedFailure(t); 
} 

Lưu ý: Chúng tôi không thực sự gửi nó đến System.err và bạn có lẽ không nên, nhưng bạn có ý tưởng.

Về phía khách hàng, chúng tôi sử dụng một lớp con của AsyncCallback được gọi là AsyncSuccessCallback. Nó xử lý các trường hợp onFailure thống nhất cho hầu hết các cuộc gọi RPC của chúng tôi. Hầu hết mã gọi lại của chúng tôi có thể xử lý trường hợp onSuccess khi biết rằng onFailure được xử lý. Nó cũng cung cấp một nơi duy nhất để thay đổi việc triển khai này sau này.

public abstract class AsyncSuccessCallback<T> implements AsyncCallback<T> { 

    public void onFailure(Throwable t) { 
     handleException(t); 
    } 

    protected void handleException(Throwable t) { 
     Window.alert(t.getMessage()); 
    } 

} 

Lưu ý: Chúng tôi không thực sự sử dụng Window.alert, nhưng một lần nữa, bạn có ý tưởng. Những gì chúng tôi làm trong trường hợp này là hiển thị Hộp thoại GWT hiển thị biểu mẫu gửi POST tới một máy chủ khác chấp nhận báo cáo lỗi. Biểu mẫu cho phép người dùng nhập mô tả về những gì họ đang làm khi xảy ra lỗi.

Về phía khách hàng, nếu bạn muốn để có được những vết đống, bạn cần phải viết một ít mã thêm:

// 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]"; 
    } 
} 
+0

Tôi chưa thử, nhưng nó có vẻ là giải pháp đúng. Tôi sẽ thử nó ngay sau khi tôi có một nhiệm vụ kết nối với đăng nhập. Đến thời điểm đó tôi đánh dấu nó là chính xác. – Zalivaka

1

Bạn muốn đăng nhập ngoại lệ nào? Phía máy khách hoặc phía máy chủ? Chúng tôi có một ứng dụng doanh nghiệp lớn với gwt. Chúng tôi sử dụng mẫu MVP trên máy khách và tất cả các yêu cầu đến máy chủ được thực hiện bằng cách sử dụng một lớp RPCservice chung. Ví dụ: saveUserService = new remoteService();

ở phía máy chủ, chúng tôi xử lý SaveUserRequest và chuẩn bị SaveUserResponse bằng mẫu lệnh. Tất cả các trường hợp ngoại lệ được xử lý ở đó, ngoài ClientWarningException còn lại để truyền cho đến khi khách hàng nơi chúng tôi hiển thị một thông điệp tốt đẹp cho người dùng.

Đây có thể là một chút tiết, nhưng nó thu nhỏ tốt trên một ứng dụng lớn với khoảng 100 nghìn loc.

+0

Trước hết, tôi cần nhật ký phía máy chủ cho lớp dịch vụ. – Zalivaka

+0

Về đề xuất của bạn, điều đó không rõ ràng đối với tôi. Bạn có thể giải thích nó được không? Theo tôi hiểu, bạn bọc ngoại lệ trong đối tượng phản hồi, liệu nó có xây dựng theo cách đó không? – Zalivaka

+0

Tất cả ngoại lệ ở phía máy chủ phải được ghi lại bằng nhật ký lựa chọn của bạn (hoặc sysout). Chúng tôi đã quyết định xử lý một số ngoại lệ theo cách đặc biệt và cho phép họ tăng lên cho khách hàng để cung cấp cho người dùng thông tin hữu ích. Ví dụ lỗi xác nhận. – Uberto

1

Sử dụng gwt-dispatch. Việc ghi nhật ký có thể được nhúng vào dịch vụ gửi đi tiêu chuẩn, như được trình bày trong mẫu sau, mà tôi đã lấy ra từ trang gwt-dispatch Getting Started.

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; 
     } 
    } 
} 
Các vấn đề liên quan