Проблемы, передающие объекты класса через RPC GWT

Вы имеете в виду, что is_single() вернет true, если это сообщение? (не страница), я прав,

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

Пожалуйста, совет.

Благодаря

20
задан Glorfindel 20 March 2019 в 09:00
поделиться

5 ответов

После долгих проб и ошибок мне удалось найти способ сделать это. Возможно, это не лучший способ, но он работает. Надеюсь, этот пост может сэкономить кому-то еще много времени и усилий.

Эти инструкции предполагают, что вы выполнили как базовое руководство по StockWatcher , так и модификации StockWatcher Google App Engine .

Создание клиентской реализации стандартного класса

При использовании GWT следует иметь в виду несколько вещей:

  1. Серверные классы могут импортировать клиентские классы, но не наоборот (обычно) .
  2. Клиентская сторона не может импортировать какие-либо библиотеки Google App Engine (например, com.google.appengine.api.users.User)

Из-за обоих пунктов выше, клиент никогда не сможет реализовать класс Stock, который мы создан на com.google.gwt.sample.stockwatcher.server. Вместо этого мы

public Long addStock(String symbol) throws NotLoggedInException {
  Stock stock = new Stock(getUser(), symbol);
  checkLoggedIn();
  PersistenceManager pm = getPersistenceManager();
  try {
    pm.makePersistent(stock);
  } finally {
    pm.close();
  }
  return stock.getId();
}

Все остальные методы остаются такими же, кроме getStocks:

public StockClient[] getStocks() throws NotLoggedInException {
  checkLoggedIn();
  PersistenceManager pm = getPersistenceManager();
  List<StockClient> stockclients = new ArrayList<StockClient>();
  try {
    Query q = pm.newQuery(Stock.class, "user == u");
    q.declareParameters("com.google.appengine.api.users.User u");
    q.setOrdering("createDate");
    List<Stock> stocks = (List<Stock>) q.execute(getUser());
    for (Stock stock : stocks)
    {
       stockclients.add(new StockClient(stock.getId(), stock.getSymbol(), stock.getCreateDate()));
    }
  } finally {
    pm.close();
  }
  return (StockClient[]) stockclients.toArray(new StockClient[0]);
}

Резюме

Приведенный выше код отлично работает у меня при развертывании в Google App Engine, но вызывает ошибку в режиме хостинга Google Web Toolkit:

SEVERE: [1244408678890000] javax.servlet.ServletContext log: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract com.google.gwt.sample.stockwatcher.client.StockClient[] com.google.gwt.sample.stockwatcher.client.StockService.getStocks() throws com.google.gwt.sample.stockwatcher.client.NotLoggedInException' threw an unexpected exception: java.lang.NullPointerException: Name is null

Позвольте мне знать, столкнулись ли вы с той же проблемой или нет. Тот факт, что он работает в Google App Engine, по всей видимости, указывает на ошибку в размещенном режиме.

23
ответ дан 30 November 2019 в 00:27
поделиться

GWT требуется файл .java в дополнение к файлу .class. Кроме того, Stock должен находиться в «клиентском» месте модуля GWT.

4
ответ дан 30 November 2019 в 00:27
поделиться

Компилятор GWT не знает о Stock, потому что он не в том месте, куда он смотрит. Вы можете либо переместить его в папку клиента, либо, если имеет смысл, оставить его там, где он is и создайте ModuleName.gwt.xml, который ссылается на любые другие классы, которые вы хотите, и получите ваш файл Main.gwt.xml для наследования от этого.

например: DomainGwt.gwt.xml

<module>
    <inherits name='com.google.gwt.user.User'/>
    <source path="javapackagesabovethispackagegohere"/>
</module>

и:

<module rename-to="gwt_ui">
    <inherits name="com.google.gwt.user.User"/>
    <inherits name="au.com.groundhog.groundpics.DomainGwt"/>

    <entry-point class="au.com.groundhog.groundpics.gwt.client.GPicsUIEntryPoint"/>
</module>
3
ответ дан 30 November 2019 в 00:27
поделиться

Да, конечно, нам нужно использовать сериализацию для передачи серверных объектов клиенту. Эти модильные ?? настройки файла не будут работать для использования класса Stock на стороне клиента.

В вашем случае у вас есть только один класс Stock, и вы можете создать StockClient на стороне клиента. Это легко. Но какое будет решение, если у кого-то будет больше занятий. Что-то вроде свойств этого класса также является другим типом классов.

Пример: stock.getEOD (date) .getHigh ();

getEOD вернет другой класс с заданной датой и в этом классе есть метод getHigh .

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

0
ответ дан 30 November 2019 в 00:27
поделиться

Здесь есть лучший ответ: Проблема с примером использования GWT Simple RPC: Код включен

В принципе, вы можете добавить параметры в свой файл APPNAME.gwt.xml, чтобы компилятор предоставил компилятору путь к серверу -затрат.

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

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