Я использую GWT 2.3 для своего приложения.Я создал генератор для генерации классов и добавления к ним поведения.
Мой генератор работает нормально, и я могу вызвать GWT.create (MyClass.class) на клиенте.Это возвращает объект MyClassImpl с правильными полями / методами.Когда я пытаюсь сериализовать объект для отправки его обратно на сервер, у меня возникает исключение SerializationException.
После отладки выясняется, что RPC-генератор не может найти определение класса для MyClassImpl.
Есть лиспособ исправить это?Я предполагал, что определение класса, сгенерированное моим собственным генератором, будет доступно генератору RPC, если только это не будет выполнено перед моим генератором?
Заранее спасибо за вашу помощь.
Фарид
Здравствуйте и спасибо за быстрый ответ,
Мой сгенерированный класс выглядит следующим образом: - у него есть открытый конструктор без аргументов - он реализует Serializable (и, конечно, я пыталсявсе комбинации Serializable и IsSerializable) - генерируется (моим генератором, когда я вызываю GWT.create ()) в общем пакете - все его атрибуты "Simple" (примитив или строка)
Похожеэто (где TestClass - это мой маркерный интерфейс для генератора):
package com.test.shared;
import com.test.shared.TestClass;
public class TestClass_Impl implements TestClass, Serializable {
private String testString = "TestString";
public TestClass_Impl() {}
public String getTestString() {
return testString;
}
}
Я могу вызвать GWT.create (TestClass.class) на клиенте.Я получаю экземпляр TestClass_Impl, но как только я пытаюсь отправить его по сети на сервер через вызов RPC GWT, я получаю исключение:
com.test.server.TestServiceServlet-29927840: An IncompatibleRemoteServiceException was thrown while processing this call.
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl
at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:315)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:206)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
....
Caused by: com.google.gwt.user.client.rpc.SerializationException: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:573)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
...
Caused by: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:366)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:337)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:543)
Похоже, RPC GWT не может найти класс TestClass_Implна сервере, когда он пытается его создать.
Есть идеи?Спасибо,
Фарид
Спасибо, Джузио.Это именно то, что происходило.Похоже, что GWT генерирует исходный код Java только с целью его кросс-компиляции в JavaScript, а затем отбрасывает созданные файлы Java.Существует опция компилятора для сохранения сгенерированного кода Java в определенной папке, но полученный файл .java не компилируется со сборкой.
Можно, хотя и очень сложно и неуклюже, изменить процесс сборки навозьмите исходные файлы, сгенерированные моим генератором, и включите их в путь сборки, чтобы они могли быть скомпилированы и доступны во время выполнения.
Вместо этого я создал отдельный класс для генерации моего исходного кода Java.Этот класс используется генератором для генерации исходного кода Java, который должен быть скомпилирован GWT.Этот же класс затем используется моим приложением для динамического создания и загрузки этих классов Java в виртуальную машину.Затем они доступны во время выполнения, и все, кажется, работает нормально.
Еще раз спасибо за вашу помощь, и если кому-то понадобится дополнительная информация об этом обходном пути, я буду рад выслать ее им.