Ở 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]";
}
}
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