2011-08-12 32 views
7

Khi chạy ứng dụng GWT của tôi (GWT 2.0.4) trong chế độ lưu trữ, gọi phương pháp RPC chạy trên Tomcat từ xa, tôi nhận được GWT serialization ngoại lệ:gwt chế độ tổ chức đồng bộ

INFO: GwtRpcEventSrvc: ERROR: The serialization policy file '/84EC7BA65AF8175BAA99B47877FDE163.gwt.rpc' was not found; did you forget to include it in this deployment? 

SEVERE: GwtRpcEventSrvc: WARNING: Failed to get the SerializationPolicy '84EC7BA65AF8175BAA99B47877FDE163' for module 'http://host:19980/MYAPP/'; a legacy, 1.3.3 compatible, serialization policy will be used. Youmay experience SerializationExceptions as a result. 

SEVERE: Exception while dispatching incoming RPC call 
Throwable occurred: com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException 
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:760) 
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:723) 
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:612) 
.at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129) 
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152) 
... 
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'com.mypackage.data.MyData' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer.For security purposes, this type will not be serialized.: instance = [email protected] 
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610) 
.at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129) 
.at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:43) 
.at com.google.gwt.user.client.rpc.core.java.util.LinkedList_CustomFieldSerializer.serialize(LinkedList_CustomFieldSerializer.java:36) 
.... 33 more 

chế độ Hosted tạo các tệp chính sách tuần tự hóa (* .gwt.rpc) với md5 khác nhau mà chúng được tạo trong quá trình biên dịch GWT - chúng được triển khai trên máy chủ của tôi. GWT thiếu tệp chính sách tuần tự hóa mà máy khách chế độ lưu trữ muốn.

Khi chạy ở chế độ không được lưu trữ, mọi thứ đều ổn.

Tôi đã cố gắng khởi chạy chế độ được lưu trữ thông qua cấu hình gỡ lỗi Ant hoặc Eclipse với cùng kết quả. Đường dẫn biên dịch GWT và đường dẫn lớp chế độ được lưu trữ (bao gồm) giống nhau.

GWT Compilation Ant kịch bản:

<java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler"> 
    <classpath> 
    <pathelement location="${basedir}/src" /> 
    <pathelement location="${dir.build.root}/ProjectA/src" /> 
    <pathelement location="${dir.build.root}/ProjectB/src" /> 
    <pathelement location="${dir.build.root}/ProjectC/src" /> 
    <pathelement location="${dir.build.root}/ProjectD/src" /> 
    <pathelement location="${dir.build.root}/ProjectE/src" /> 
    <pathelement location="${dir.root}/ProjectD/src" /> 
    <pathelement location="${dir.root}/THIRDPARTY/build/athirdparty.jar" /> 
    <pathelement location="${dir.commons.gwtcompiler}/gwt-user.jar" /> 
    <pathelement location="${dir.commons.gwtcompiler}/gwt-dev.jar" /> 
    <pathelement location="../ExternalLibs/libs/gwt-log-3.0.0.jar" /> 
<!-- JAXB API sources needed for GWT compilation of JAXB annotated classes --> 
    <pathelement location="../ExternalLibs/nonshipjars/jaxb-api-src.zip" /> 
    </classpath> 
    <jvmarg value="-Xmx1g" /> 
    <jvmarg value="-Dgwt.nowarn.metadata" /> 
    <arg line="-localWorkers 2 -style OBF" /> 
    <arg line="-war ${basedir}/www" /> 
    <arg line="-extra ${basedir}/build" /> 
    <arg value="com.myapp.Main" /> 
</java> 

Hosted mode ra mắt - Ant kịch bản:

<target name="hosted" description="Run hosted mode"> 
    <java failonerror="true" fork="true" classname="com.google.gwt.dev.HostedMode"> 
    <classpath> 
     <pathelement location="${basedir}/src" /> 
     <pathelement location="${dir.build.root}/ProjectA/src" /> 
     <pathelement location="${dir.build.root}/ProjectB/src" /> 
     <pathelement location="${dir.build.root}/ProjectC/src" /> 
     <pathelement location="${dir.build.root}/ProjectD/src" /> 
     <pathelement location="${dir.build.root}/ProjectE/src" /> 
     <pathelement location="${dir.root}/ProjectD/src" /> 
     <pathelement location="${dir.root}/THIRDPARTY/build/athirdparty.jar" /> 
     <pathelement location="${dir.commons.gwtcompiler}/gwt-user.jar" /> 
     <pathelement location="${dir.commons.gwtcompiler}/gwt-dev.jar" /> 
     <pathelement location="../ExternalLibs/libs/gwt-log-3.0.0.jar" /> 
    <!-- JAXB API sources needed for GWT compilation of JAXB annotated classes --> 
     <pathelement location="../ExternalLibs/nonshipjars/jaxb-api-src.zip" /> 
    </classpath> 
    <jvmarg value="-Xmx1g" /> 
    <jvmarg value="-Dgwt.nowarn.metadata" /> 
    <arg line="com.myapp.Main" /> 
    <arg line="-startupUrl" /> 
    <arg line=" http://host:19980/MYAPP/Main.html" /> 
    <arg line="-whitelist" /> 
    <arg line="^http[:][/][/]host[:]19980" /> 
    <arg line="-whitelist" /> 
    <arg line=" ^http[:][/][/]localhost" /> 
    <arg line="-whitelist" /> 
    <arg line="^http[:][/][/]127.0.0.1" /> 
    <arg line="-port" /> 
    <arg line="8080" /> 
    <arg line="-noserver" /> 
    <arg line="-logLevel" /> 
    <arg line="DEBUG" /> 
    </java> 
</target> 

RPC phương pháp chữ ký:

public List<MyData> getSmpeWorkDddefZonesData(String processId); 

MyData định nghĩa (khai báo trong ProjectE đó là phi Dự án -GWT - tầng dữ liệu):

package com.mypackage.data; 

import java.io.Serializable; 

public interface MyData extends Serializable {... 

MyData được liên kết trong mô-đun được thừa hưởng từ một mô-đun GWT: com.mypackage.Data.gwt.xml:

<module> 
    <source path="data" /> 
</module> 

mô-đun chính com.myapp.Main.gwt.xml:

... 
    <inherits name="com.mypackage.Data" /> 
... 

Làm thế nào để làm cho tổ chức tạo ra các tập tin chính sách serialization giống nhau không?

Trả lời

3

Tôi đã gặp sự cố tương tự. Giải pháp duy nhất tôi thấy, là đảm bảo bạn có cùng các tệp .gwt.rpc ở cả hai bên.

Điều đó có nghĩa là, mỗi khi bạn khởi động hoặc tải lại chế độ Dev, bạn phải thay thế các tệp cũ .gwt.rpc được triển khai trên máy chủ web của bạn bằng các tệp mới được tạo.

Hoặc bạn trỏ thư mục đầu ra chiến dịch Chế độ Dev vào ngữ cảnh máy chủ web. Và đảm bảo máy chủ web đã bật tự động triển khai. Vì vậy, mỗi khi các tập tin được thay đổi bởi Dev Mode, máy chủ web sẽ tự động tải lại các tập tin.

+2

Cảm ơn, nó giúp! Chỉ cần thêm các chi tiết khác: Tôi phải bắt đầu chế độ được lưu trữ với tùy chọn -war/path/to/my/built/war thay vì đường dẫn mặc định. – foch

0

Dựa trên những gì tôi thấy trong com.google.gwt.user.rebind.rpc.ProxyCreator GWT tạo tên của chính sách tuần tự .gwt.rpc tệp theo nội dung của chúng (md5).

Vì vậy, vì lý do nào đó, chính sách tuần tự hóa trong chế độ Super Dev khác với chính sách được tạo trong quá trình xây dựng thông thường.

Phương pháp sau đây khắc phục vấn đề đối với tôi:

  1. chính sách Mở serialization .gwt.rpc tập tin được tạo ra cho việc xây dựng thường xuyên
  2. Mở chính sách serialization .gwt.rpc tập tin được tạo cho chế độ Super Dev. Bạn có thể tìm thấy nó ở đâu bằng cách nhìn vào thư mục công việc được in ở chế độ Super Dev Mode. Ví dụ. trong trường hợp của tôi, đó là: "workDir: C: \ Users \ your_user \ AppData \ Local \ Temp \ gwt-codeserver-5658052675265790575.tmp"
  3. So sánh 2 tệp - điều này có thể cung cấp cho bạn một gợi ý khá hay về vị trí của sự cố có thể là. Trong trường hợp của tôi, 2 loại không cần thiết đã được thêm vào chính sách tuần tự hóa và tôi có thể xóa chúng hoàn toàn khỏi dự án.
  4. Sau khi sửa chữa các sai lệch tên .gwt.rpc file nên giống hệt nhau một lần nữa và vấn đề sẽ được cố định :)
Các vấn đề liên quan