2012-01-20 30 views
6

Tôi đang sử dụng GWT (2.4) với Spring tích hợp như trong article này. Tôi có vấn đề với việc nhận được danh sách của người dùng từ cơ sở dữ liệu (Hibernate) và cư DataGrid với nó. Khi tôi gọi greetingService.allUsers() phương pháp, tôi nhận được lỗi (onFailure()):GWT: Phản hồi không thể được deserialized

com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: Câu trả lời không thể deserialized

Có ai giúp điều đó không? Dưới đây là một số đoạn mã. Dự án làm việc đầy đủ là here.

public void onModuleLoad() { 
    // ... 
    greetingService.allUsers(
     new AsyncCallback<List<User>>(){ 
      @Override 
      public void onFailure(Throwable caught) { 
       caught.printStackTrace(); 
      } 
      @Override 
      public void onSuccess(List<User> result) { 
       GWT.log("SIZE: "+result.size()); 
       dataGrid.setRowData(result); 
      } 
     } 
    ); 
    // ... 
} 

GreetingServiceImpl

@Override 
public List<User> allUsers() { 
    return userDAO.findAll(); 
} 

tài

@Entity 
@Table(name = "users") 
public class User implements Serializable, IsSerializable { 

    @Id 
    private Long id; 

    // only Strings and one Date 
    private String login; 
    private String password; 
    private String firstname; 
    private String lastname; 
    private Date date; 
} 

Trả lời

1

Tôi đã giải quyết được sự cố của mình bằng cách cập nhật GwtRpcController theo this. Bây giờ deserialization hoạt động tốt mà không cần sử dụng bất kỳ đối tượng chuyển giao. Làm việc GwtRpcController bên dưới.

import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.context.ServletContextAware; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.Controller; 
import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException; 
import com.google.gwt.user.client.rpc.RemoteService; 
import com.google.gwt.user.client.rpc.SerializationException; 
import com.google.gwt.user.server.rpc.RPC; 
import com.google.gwt.user.server.rpc.RPCRequest; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 

public class GwtRpcController extends RemoteServiceServlet implements 
     Controller, ServletContextAware { 

    private static final long serialVersionUID = 1L; 

    private ServletContext servletContext; 

    private RemoteService remoteService; 

    private Class remoteServiceClass; 

    public ModelAndView handleRequest(HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
     super.doPost(request, response); 
     return null; 
    } 

    @Override 
    public String processCall(String payload) throws SerializationException { 
     try { 

      RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, this); 
      onAfterRequestDeserialized(rpcRequest); 

      // delegate work to the spring injected service 
      return RPC.invokeAndEncodeResponse(this.remoteService, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest.getSerializationPolicy()); 
     } catch (IncompatibleRemoteServiceException ex) { 
      getServletContext().log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex); 
      return RPC.encodeResponseForFailure(null, ex); 
     } 
    } 

    @Override 
    public ServletContext getServletContext() { 
     return servletContext; 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
    } 

    public void setRemoteService(RemoteService remoteService) { 
     this.remoteService = remoteService; 
     this.remoteServiceClass = this.remoteService.getClass(); 
    } 

} 
6

Tài liệu cho IncompatibleRemoteServiceException nói:

ngoại lệ này có thể được gây ra bởi các vấn đề sau:

  • Không thể định vị {@link RemoteService} được yêu cầu qua {@link Lớp # forName (Chuỗi)} trên máy chủ.
  • Giao diện {@link RemoteService} được yêu cầu không được triển khai bởi trường hợp {@link com.google.gwt.user.server.rpc.RemoteServiceServlet RemoteServiceServlet} được định cấu hình để xử lý yêu cầu .
  • Phương thức dịch vụ được yêu cầu không được xác định hoặc được kế thừa bởi giao diện {@link RemoteService} được yêu cầu.

  • Một trong các loại được sử dụng trong phương pháp {@link RemoteService} yêu cầu đã thêm hoặc xóa trường.
  • Mã khách hàng nhận được loại từ máy chủ mà nó không thể
    deserialize.

Trong trường hợp của bạn là điểm cuối cùng, bạn có một kiểu mà không thể được đăng và deserialized, đó là một lớp User của bạn là một trong số họ. Bạn nên có một đối tượng chuyển giao thực hiện giao diện com.google.gwt.user.client.rpc.IsSerializable để truyền đối tượng Người dùng trên mạng. Để biết thêm thông tin, xem: Compatibility with the Java Language and Libraries. Tham số phương thức GWT RPC và các kiểu trả về phải được truyền qua mạng giữa các ứng dụng máy khách và máy chủ và do đó chúng phải là serializable.

2

Tôi sẽ thử một vài thứ.

  • Trong tài khoản thực hiện chỉ com.google.gwt.user.client.rpc.IsSerializable và thêm một trống constructor. Tôi nhớ đọc một nơi nào đó một thời gian dài trước đây rằng điều này là cần thiết và nó giải quyết một vấn đề như thế này trong một trong các dự án của tôi. Người dùng công khai() { }
  • Đảm bảo gói của bạn được xác định trong tệp gwt.xml của bạn.

Bạn không làm bất cứ điều gì phức tạp hơn mà không thể được sắp xếp theo thứ tự sao cho bạn nên ổn với điều đó.

+0

Oh sợ hãi không có nhà xây dựng arg đã nhận được tôi rất nhiều lần ... Nó có thể là riêng tư. – DTing

+0

Tôi có thanh cuộn trống. Ý của bạn là gì: _ "Đảm bảo gói của bạn được định nghĩa trong tệp gwt.xml" _? – marioosh

+0

Trong dự án của bạn, bạn sẽ có tệp .gwt.xml ở gốc của src. Trong đó ở phía dưới bạn sẽ thấy những gì tôi đang nói về. Đây là một liên kết hữu ích: [Xử lý đường dẫn] (http://code.google.com/p/google-web-toolkit-incubator/wiki/PathsHandlingFAQ) –

0

All, duyệt rất nhiều thời gian với điều này, và tôi có một giải pháp khác nhau. Tôi đã sử dụng một thiết lập rất đơn giản và POJO của tôi thực sự không còn gì là thành viên và CTOR.

Tôi đã tạo lại một dự án GWT mới và thêm công cụ của tôi trở lại dự án mới, thêm mỗi phụ thuộc POM.xml vào. Những gì tôi thấy là trình biên dịch maven được đặt quá cao. Tôi đã sao chép này từ một dự án khác không suy nghĩ về nó ... bên GWT khách hàng là khá nhiều chỉ 1,5, có lẽ 1.6 tương thích ... do đó, những thiết lập cần phải được thiết lập để 1.5, không 1,7

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-compiler-plugin</artifactId> 
<version>2.3.2</version> 
<configuration> 
    <source>1.7</source>      <!-- change these to 1.5 --> 
    <target>1.7</target> 
</configuration> 
</plugin> 
0

tôi đã có lỗi khi sử dụng ổi-gwt với phạm vi "được cung cấp". Để đáp ứng các phụ thuộc trong thời gian chạy, tôi đã thêm bộ sưu tập google. Ứng dụng khách GWT không thể deserialize những người.

Giải pháp: xóa phụ thuộc vào bộ sưu tập google và gắn với ổi.

0

Để vấn đề với các đối tượng serializable, bạn có thể thử danh sách kiểm tra này:

  1. Xác minh rằng các lớp có một constructor mặc định (không có đối số)
  2. Xác minh rằng các lớp thực hiện Serializable hoặc IsSerializable hoặc thực hiện một Giao diện mở rộng Serializable hoặc mở rộng một lớp học triển khai Serializable
  3. Xác minh rằng lớp đó nằm trong ứng dụng khách. * Gói hoặc…
  4. Xác minh, nếu lớp là n ot trong khách hàng. * gói, được biên dịch trong định nghĩa mô-đun GWT xml của bạn. Theo mặc định là hiện tại. Nếu lớp học của bạn nằm trong gói khác, bạn phải thêm nó vào nguồn. Ví dụ: nếu lớp học của bạn thuộc miền. * Bạn nên thêm nó vào xml dưới dạng. Hãy lưu ý rằng lớp học không thể thuộc về gói máy chủ! Chi tiết khác về GWT trang: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. Nếu bạn bao gồm lớp từ dự án GWT khác, bạn phải thêm thừa kế vào định nghĩa mô-đun xml của bạn. Ví dụ: nếu lớp học Foo của bạn nằm trong gói com.dummy.domain bạn phải thêm vào định nghĩa mô-đun . Xem thêm chi tiết ở đây: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. Nếu bạn đã bao gồm các lớp từ một dự án GWT phát hành dưới dạng một jar xác minh rằng jar cũng chứa mã nguồn vì GWT biên dịch lại cũng là nguồn Java cho các lớp học truyền cho Chủ đầu tư.

Font: http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/

0

Tôi đang làm việc trong một nhóm với phần mềm trưởng thành mà một ngày ngừng làm việc cho tôi do lỗi này. Phần còn lại của đội đều ổn. Chúng tôi đã thử mọi thứ để khắc phục.Cuối cùng, chúng tôi cài đặt lại IntelliJ và đã sửa nó.

0

Đôi khi lỗi này có thể do tệp/bộ nhớ cache phía máy khách lỗi thời/hỏng (Không có thông báo lỗi phía máy chủ trong trường hợp này). Tôi chỉ chạy "xây dựng lại mô-đun" trong IntelliJ và nó đã được tốt một lần nữa.

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