Как я добавляю тип к белому списку политики Сериализации GWT?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

35
задан Xaerxess 16 May 2014 в 16:15
поделиться

7 ответов

Любые определенные типы, которые Вы включаете в свой сервисный интерфейс и любые типы, на которые они ссылаются, будут автоматически добавлены в белый список, пока они реализуют java.io. Сериализуемый, например:

public String getStringForDates(ArrayList<java.util.Date> dates);

приведет к ArrayList и Дате оба включаемый в белый список.

Это становится более хитрым, при попытке использовать java.lang. Объект вместо определенных типов:

public Object getObjectForString(String str);

, поскольку компилятор не знает, что добавить в белый список. В этом случае, если на объекты не ссылаются нигде в Вашем сервисном интерфейсе, необходимо отметить их явно с интерфейсом IsSerializable, иначе это не позволит Вам передать их через механизм RPC.

11
ответ дан rustyshelf 27 November 2019 в 07:14
поделиться

Белый список сгенерирован компилятором GWT и содержит все записи, которые определяются интерфейсом маркера IsSerializable.

Для добавления типа к списку просто необходимо удостовериться, что класс реализует интерфейс IsSerializable.

Дополнительно для сериализации для работы правильно класс должен иметь значение по умолчанию никакой конструктор аргумента (конструктор может быть частным в случае необходимости). Также, если класс является внутренним, он должен быть отмечен как статичный.

8
ответ дан pfranza 27 November 2019 в 07:14
поделиться

Есть обходной путь: определите новый класс Dummy с полями-членами всех типов, которые вы хотите включить в сериализацию. Затем добавьте метод в свой интерфейс RPC:

Dummy dummy(Dummy d);

Реализация такова:

Dummy dummy(Dummy d) { return d; }

А асинхронный интерфейс будет иметь это:

void dummy(Dummy d, AsyncCallback< Dummy> callback);

Компилятор GWT подберет это, и потому что Dummy class ссылается на эти типы, он будет включать их в белый список.

Пример Dummy class:

public class Dummy implements IsSerializable {
    private java.sql.Date d;
}
30
ответ дан 27 November 2019 в 07:14
поделиться

ИМХО, самый простой способ программного доступа к белому списку - это создать класс, подобный этому:

public class SerializableWhitelist implements IsSerializable {
    String[] dummy1;
    SomeOtherThingsIWishToSerialize dummy2;
}

Затем включить его в пакет .client и ссылку из службы RPC. (поэтому он анализируется компилятором.)

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

2
ответ дан 27 November 2019 в 07:14
поделиться

, чтобы обеспечить желаемый результат, удалите все war / /gwt/*.gwt.rpc[1284 sizes

1
ответ дан 27 November 2019 в 07:14
поделиться

Всем, кто задаст тот же вопрос и не найдет предыдущие ответы удовлетворительными ...

Я использую GWT с GWTController, так как я использую Spring, который я модифицировал как описано в этом сообщении . В сообщении объясняется, как изменить GrailsRemoteServiceServlet, но GWTController вызывает RPC.decodeRequest () и RPC.encodeResponseForSuccess () таким же образом.

Это последняя версия GWTController, которую я использую:

/**
 * Used to instantiate GWT server in Spring context.
 *
 * Original version from <a href="http://docs.google.com/Doc?docid=dw2zgx2_25492p5qxfq&hl=en">this tutorial</a>.
 * 
 * ...fixed to work as explained <a href="http://blog.js-development.com/2009/09/gwt-meets-spring.html">in this tutorial</a>.
 * 
 * ...and then fixed to use StandardSerializationPolicy as explained in
 * <a href="http://markmail.org/message/k5j2vni6yzcokjsw">this message</a> to allow
 * using Serializable instead of IsSerializable in model.
 */
public class GWTController extends RemoteServiceServlet implements Controller, ServletContextAware {

 // Instance fields

 private RemoteService remoteService;

 private Class<? extends RemoteService> remoteServiceClass;

 private ServletContext servletContext;

 // Public methods

 /**
  * Call GWT's RemoteService doPost() method and return null.
  * 
  * @param request
  *            The current HTTP request
  * @param response
  *            The current HTTP response
  * @return A ModelAndView to render, or null if handled directly
  * @throws Exception
  *             In case of errors
  */
 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  doPost(request, response);
  return null; // response handled by GWT RPC over XmlHttpRequest
 }

 /**
  * Process the RPC request encoded into the payload string and return a string that encodes either the method return
  * or an exception thrown by it.
  * 
  * @param payload
  *            The RPC payload
  */
 public String processCall(String payload) throws SerializationException {
  try {
   RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, this);

   // delegate work to the spring injected service
   return RPC.invokeAndEncodeResponse(this.remoteService, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest.getSerializationPolicy());
  } catch (IncompatibleRemoteServiceException e) {
   return RPC.encodeResponseForFailure(null, e);
  }
 }

 /**
  * Setter for Spring injection of the GWT RemoteService object.
  * 
  * @param RemoteService
  *            The GWT RemoteService implementation that will be delegated to by the {@code GWTController}.
  */
 public void setRemoteService(RemoteService remoteService) {
  this.remoteService = remoteService;
  this.remoteServiceClass = this.remoteService.getClass();
 }

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

 public void setServletContext(ServletContext servletContext) {
  this.servletContext = servletContext;
 }
}
0
ответ дан 27 November 2019 в 07:14
поделиться

Белый список создается компилятором gwt и содержит все записи, обозначенные интерфейсом маркера IsSerializable.

Чтобы добавить тип в список, вам просто нужно убедиться, что класс реализует интерфейс IsSerializable.

- Андрей

Это, вероятно, самое простое решение. Единственное, что нужно помнить при этом, это то, что все классы, которые вы хотите сериализовать, должны иметь конструктор "общедоступный, без аргументов" и (в зависимости от требований) методы установки для полей-членов.

1
ответ дан 27 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: