2012-03-02 4 views
13

Прошло некоторое время с тех пор, как я делал GWT, и мне нужно было что-то маленькое сделать быстро. Я задал вопросы, и теперь у меня есть RPC, в котором я нуждаюсь, но он терпит неудачу.GWT - RPC SerializationException

RPC должен предоставить мне ArrayList, а вакансия находится в # projectname # .client.model. Вызов выполнен в # projectname # .client.model.
Интерфейсы для моих услуг находятся в # project # name.client.Service.
Наконец, вызовы, конечно, перейдите к # projectname # .server.
Вакантные принадлежности IsSerializable. Исключением я получаю от запуска моего RPC является следующее:

Starting Jetty on port 8888 
[WARN] Exception while dispatching incoming RPC call 
com.google.gwt.user.client.rpc.SerializationException: Type 'firsteight.client.model.Vacancy' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [email protected] 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:51) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:28) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 

RPC Я делаю это следующим образом:

void getVacs() { 
    try { 
     homeService.getVacancies(new AsyncCallback<ArrayList<Vacancy>>() { 
      public void onFailure(Throwable caught) 
      { 
       RootPanel.get("grayblock").add(new HTML("Failed:" + caught.getMessage())); 
      } 

      public void onSuccess(ArrayList<Vacancy> result) 
      { 
       RootPanel.get("grayblock").add(new HTML(result.get(0).getTitle())); 
      } 
     }); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Я думал, что сделал все, что нужно, чтобы сделать Вакансию Сериализуемой, и ArrayList вакансий в качестве возвращаемого типа для RPC считает наличие вакансий в качестве возвращаемого типа. правильно? Что я делаю не так?

Заранее благодарен!

+0

Вы уверены, что выполнили '' com.google.gwt.user.client.rpc.IsSerializable' в своем классе 'Вакансия'? –

+1

'импорт com.google.gwt.user.client.rpc.IsSerializable;' 'общественный класс Вакансия реализует IsSerializable {' Абсолютно. –

ответ

30

Обычно это вызвано использованием класса, не связанного с сериализацией, который может возникнуть, если ваш класс не реализует com.google.gwt.user.client.rpc.IsSerializable, или если вы забыли добавить пустой конструктор.

Чтобы передать фасоль, вы должны выполнить следующие требования (с сайта GWT):

  1. Он реализует либо Java Serializable или интерфейс GWT IsSerializable, либо непосредственно, либо потому, что оно происходит от суперкласса , что делает.
  2. Его неконечное, непреходящего поля экземпляра сами по себе являются сериализуемая
  3. Он по умолчанию (нулевой аргумент) конструктор с любым доступом модификатора (например, частный Foo() {} будет работать)

Даже если выполнить эти требования, может случиться, что GWT компилятор говорит:

не был включен в набор типов, которые могут быть сериализовать этим SerializationPolicy или его объект класса не могЗагрузите. Для целей обеспечения безопасности этот тип не сериализуется .: instance = @

У этой проблемы могут быть разные причины. Вот его список полной проверки использовать для решения этой проблемы:

  1. Убедитесь, что класс имеет конструктор по умолчанию (без аргументов)
  2. Убедитесь, что класс реализует Serializable или IsSerializable или реализует интерфейс, который расширяет Сериализуемым или расширяет класс , который реализует Serializable
  3. Убедитесь, что класс находится в клиенте. * package или ...
  4. Проверьте, нет ли класса на клиенте.*, который скомпилирован в вашем определении модуля XML GWT. По умолчанию присутствует. Если ваш класс находится в другом пакете, вы должны добавить его в . Например, если ваш класс находится в домене. * Вы должны добавить его в xml as. Имейте в виду, что класс не может принадлежать серверу! Более подробная информация на странице GWT: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. Если вы включаете класс из другого проекта GWT, вы должны указать наследование на определение вашего xml-модуля. Например, если ваш класс Foo находится в пакете com.dummy.domain, вы должны добавить в определение модуля. Подробнее здесь: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. Если вы включаете класс из другого проекта GWT выпущен в баночки проверить, что сосуд содержит также исходный код, потому что GWT перекомпиляции также источник Java для классов, переданных Клиент.

PS: скопировано из http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/, так как в настоящий момент сайт недоступен. Если вы хотите прочитать исходную статью, найдите ее из Google, используя указанный выше URL-адрес, и прочитайте его из кеша Google.

+1

Я включил следующий конструктор: 'public Вакансия() {}'. Объект, который я извлекаю с сервера, использует параметризованный конструктор, но я не думаю, что это должно иметь значение. (?) –

+0

вы можете поделиться своим классом, который реализует интерфейс RemoteService и переносит объект. Вакансия –

+0

Реализация на стороне сервера, в настоящее время с демо-данные: http://pastebin.com/f88rMZEJ Услуги: http://pastebin.com/Yt8piq1m асинхронный: http://pastebin.com/Lbuav4yr –

6

Причина Ahother для этого исключения была устаревшей javascript на стороне браузера. Мне пришлось перезагрузить (CTRL + F5) код, и это исключение исчезло.

0

я тоже эту ошибку, когда я использовал подсписок:

return myList.subList(fromIndex, toIndex); 
+0

Работает ли он, если вы протестируете 'return myList'? 'sublist' не должен изменять возвращаемый тип. –

+0

myList не изменился, но я хотел получить подсписку, поэтому я сделал это для цикла (java 7) – paka

0

В моем случае есть какой-то старый кэш в моей target папке, которая не была должным образом обновлена. Мне пришлось перестроить проект (Maven -> Update Project), а затем он сработал.