2011-09-30 21 views
7

Tôi đang triển khai ứng dụng GWT 2.4 trên Glassfish 3.0.1. Tôi có thể dễ dàng truy cập vào ứng dụng của tôi qua http://host:PORT/appContext/
Tuy nhiên, khi tôi đảo ngược proxy ứng dụng với Apache tôi nhận được một ngoại lệ với các đoạn trích sau đây (từ bản ghi Glassfish):Hiệu ứng của proxy ngược trên ứng dụng GWT là gì?

ngoại lệ khi cử đến RPC gọi com.google. gwt.user.client.rpc.SerializationException: Gõ 'com.ozdokmeci.basicgwtproject.shared.GroupData' không thể gán cho 'com.google.gwt.user.client.rpc.IsSerializable' và không có bộ nối tiếp trường tùy chỉnh . Vì mục đích bảo mật, loại này sẽ không được đăng.

Triển khai IsSerializable giải quyết sự cố theo thông báo Chi trong related question. Ngoài ra còn có cách giải quyết khác trong câu hỏi liên quan.

Câu hỏi của tôi là nguyên nhân cơ bản của vấn đề này và làm thế nào hai giải pháp dường như không liên quan (triển khai giao diện điểm đánh dấu và mở rộng một lớp servlet) giải quyết vấn đề này? Ngoài ra có bất kỳ bất lợi cho cả hai phương pháp được đề cập trong related question?

Lưu ý: Ngoại lệ không xảy ra nếu ứng dụng được truy cập trực tiếp.

Lưu ý2: Lớp liên quan đến ngoại lệ đã triển khai giao diện Serializable, tương đương với IsSerializable khi có liên quan đến GWT.

+0

Bạn có chắc chắn ngoại lệ xảy ra khi nó được truy cập qua Apache - bạn cần kiểm tra giả định đó. Tôi nghĩ rằng lỗi đang xảy ra ngay cả khi bạn truy cập trực tiếp vào nó. Ngoại lệ không có gì để làm với proxy ngược. – gkamal

+0

Ngoại lệ chỉ xảy ra khi nó được proxy phía sau Apache (tôi không gợi ý rằng Apache đang gây ra nó). Khi tôi truy cập ứng dụng trực tiếp, không có ngoại lệ nào xảy ra. Đây không phải là một giả định và tôi đã kiểm tra nhật ký nhiều lần trước khi đăng câu hỏi. Tôi biết rằng ngoại lệ không liên quan trực tiếp với proxy ngược và đó là lý do tại sao tôi hỏi câu hỏi này :) – Kaan

+0

Tôi nghĩ rằng có điều gì đó không ổn - khi bạn nói không apache là máy chủ lưu trữ/devmode hoặc truy cập phiên bản js đã biên dịch . Bạn có thể kiểm tra xem cả hai đang chạy cùng một phiên bản của mã (bộ nhớ đệm, xây dựng không đúng vv được loại trừ). Thực hiện một số thay đổi có thể nhìn thấy trên trang chính và kiểm tra xem thay đổi có xuất hiện thông qua proxy apache hay không. – gkamal

Trả lời

3

Tôi đã gặp vấn đề tương tự và khi tôi truy tìm mã nguồn tôi thấy rằng thư mục tệp serialization GWT không được tìm thấy khi đảo ngược proxy (tôi nghĩ vì thư mục là đường dẫn tương đối). Đây là lý do tại sao bạn nhận được ngoại lệ serialization mặc dù bạn đã thực hiện IsSerializable.

Giải pháp cuối cùng của tôi là chuyển sang JSON yên tĩnh cho RPC của tôi. Sử dụng JSON sẽ cho phép bạn đảo ngược proxy vì nó không cần phải tìm các tệp Tuần tự hóa này.

Sửa

Nếu bạn muốn vẫn sử dụng GWT RPC Mặc dù vậy, tôi có một ý tưởng về làm thế nào nó có thể (mặc dù tôi havent thực hiện nó bản thân mình).

Đầu tiên, hãy xem Trợ giúp GWT về những tập tin này rpc: https://developers.google.com/web-toolkit/doc/2.4/DevGuideCompilingAndDebugging#key_application_files

Bạn sẽ thấy nó nói:

tập tin chính sách

Các serialization phải được truy cập bởi RemoteServiceServlet RPC của bạn thông qua ServletContext .getResource() gọi

Vì vậy, bạn sẽ cần ghi đè RemoteServiceServlet và trỏ lại vị trí của tệp rpc (chính sách tuần tự hóa).

Dưới đây là một gợi ý, lấy từ trang web này: http://code.google.com/p/google-web-toolkit/issues/detail?id=4817

public class MyRemoteServiceServlet extends RemoteServiceServlet 
    { 

    ... 

    @Override 
    protected SerializationPolicy doGetSerializationPolicy(
      HttpServletRequest request, String moduleBaseURL, String strongName) { 
      //get the base url from the header instead of the body this way 
      //apache reverse proxy with rewrite on the header can work 
      String moduleBaseURLHdr = request.getHeader("X-GWT-Module-Base"); 

      if(moduleBaseURLHdr != null){ 
        moduleBaseURL = moduleBaseURLHdr; 
      } 

      return super.doGetSerializationPolicy(request, moduleBaseURL, strongName); 
    } 

    ... 

Trong apache cấu hình add:

ProxyPass /app/ ajp://localhost:8009/App-0.0.1-SNAPSHOT/ 

    <Location /app/> 

    RequestHeader edit X-GWT-Module-Base ^(.*)/app/(.*)$ $1/App-0.0.1-SNAPSHOT/$2 

    </Location> 

Hy vọng rằng đề nghị của tôi trên ít nhất điểm một người nào đó đi đúng hướng. Vui lòng cho chúng tôi biết nếu ai đó thực hiện điều này và hoạt động.

+0

Giải pháp của bạn rất tuyệt. Nó sẽ có lợi cho người khác nếu bạn có thể xây dựng trên nguyên nhân cơ bản (thư mục tương đối?) Hoặc phác thảo cấu trúc của serialization GWT nếu bạn biết nó :) Cảm ơn – Kaan

+0

@Kaan - Được rồi, tôi đã cập nhật giải pháp của mình với một số chi tiết hơn .. Tôi vẫn chưa thực hiện điều này bản thân mình, vì vậy hãy thử nó ra và cho mọi người biết nếu nó hoạt động! – jasop

+0

@jsop - Cảm ơn bạn đã cập nhật, gợi ý và con trỏ tốt. Tôi sẽ không thể thử điều này sớm. Chấp nhận như một câu trả lời cho đến lúc đó. – Kaan

Các vấn đề liên quan