Подтвердить что ты не робот

GWT - исключение Serialization RPC

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

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();
    }
}

Я думал, что сделал все, что мне нужно, чтобы сделать Vacancy Serializable, и ArrayList of Vacancy, как returntype для RPC, считает, что у Вакансии есть тип возврата.. правильно? Что я делаю неправильно?

Спасибо заранее!

4b9b3361

Ответ 1

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

Для передачи bean вам необходимо выполнить следующие требования (с сайта GWT):

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

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

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

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

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

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

Ответ 2

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