English 中文(简体)
GWT RPC
原标题:
  • 时间:2009-06-06 02:48:28
  •  标签:

我通过谷歌网络工具kit StockWatcher Tutorial , 使用了Eclipse , 和

我修改了储存服务机边类别的“植被统计”方法,以便回收一系列存货物体而不是固定物体。 申请完全汇编,但谷歌网络工具包正在退回以下错误:

“没有任何源代码可用于 type.google.gwt.sample.stockwatcher.Stock;你是否忘记继承必要的模块?”

Google Web Toolkit Hosted Mode

看来,即使该类产品已经进口,客户的班子也难以找到存货用途。 这里是我一揽子等级的概述:

Eclipse Package Hierarchy

我怀疑我在web.xml中漏掉了一些东西,但我不知道是什么。有人能指导我吗?

http://www.un.org。 必须指出,库存类别是可维持的,因此需要留在服务器上。

最佳回答

经过很多审判和错误之后,我设法找到了这样做的办法。 这也许不是最佳办法,但它是行之有效的。 希望这一职位能够节省其他人很多时间和精力。

这些指示假定,你完成了basic StockWatcher tutorial

Create a Client-Side Implementation of the Stock Class

有一些事情需要记住:

  1. Server-side classes can import client-side classes, but not vice-versa (usually).
  2. The client-side can t import any Google App Engine libraries (i.e. com.google.appengine.api.users.User)

由于上述两个项目,客户永远无法执行我们在 com.google.gwt.sample.stockwatcher.server中建立的储备类别。 相反,我们制造了一个称为“股票”的新的客户-方储备类别。

StockClient.java:

package com.google.gwt.sample.stockwatcher.client;

import java.io.Serializable;
import java.util.Date;

public class StockClient implements Serializable {

  private Long id;
  private String symbol;
  private Date createDate;

  public StockClient() {
    this.createDate = new Date();
  }

  public StockClient(String symbol) {
    this.symbol = symbol;
    this.createDate = new Date();
  }

  public StockClient(Long id, String symbol, Date createDate) {
    this();
    this.id = id;
    this.symbol = symbol;
    this.createDate = createDate;
  }

  public Long getId() {
      return this.id;
  }

  public String getSymbol() {
      return this.symbol;
  }

  public Date getCreateDate() {
      return this.createDate;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public void setSymbol(String symbol) {
      this.symbol = symbol;
  }
}

Modify Client Classes to Use StockClient[] instead of String[]

现在,我们对客户类别做了一些简单的修改,以便他们知道,皇家警察部队将返回股票公司,而不是“努力”。

StockService.java:

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.sample.stockwatcher.client.NotLoggedInException;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("stock")
public interface StockService extends RemoteService {
  public Long addStock(String symbol) throws NotLoggedInException;
  public void removeStock(String symbol) throws NotLoggedInException;
  public StockClient[] getStocks() throws NotLoggedInException;
}

StockServiceAsync.java:

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.sample.stockwatcher.client.StockClient;
import com.google.gwt.user.client.rpc.AsyncCallback;

public interface StockServiceAsync {
  public void addStock(String symbol, AsyncCallback<Long> async);
  public void removeStock(String symbol, AsyncCallback<Void> async);
  public void getStocks(AsyncCallback<StockClient[]> async);
}

StockWatcher.java:

进口:

import com.google.gwt.sample.stockwatcher.client.StockClient;

所有其他法典保持不变,但添加Stock、装载Stocks和显示Stocks除外:

private void loadStocks() {
    stockService = GWT.create(StockService.class);
    stockService.getStocks(new AsyncCallback<String[]>() {
        public void onFailure(Throwable error) {
            handleError(error);
        }

        public void onSuccess(String[] symbols) {
            displayStocks(symbols);
        }
    });
}

private void displayStocks(String[] symbols) {
    for (String symbol : symbols) {
        displayStock(symbol);
    }
}

private void addStock() {
    final String symbol = newSymbolTextBox.getText().toUpperCase().trim();
    newSymbolTextBox.setFocus(true);

    // Stock code must be between 1 and 10 chars that are numbers, letters,
    // or dots.
    if (!symbol.matches("^[0-9a-zA-Z\.]{1,10}$")) {
        Window.alert(" " + symbol + "  is not a valid symbol.");
        newSymbolTextBox.selectAll();
        return;
    }

    newSymbolTextBox.setText("");

    // Don t add the stock if it s already in the table.
    if (stocks.contains(symbol))
        return;

    addStock(new StockClient(symbol));
}

private void addStock(final StockClient stock) {
    stockService.addStock(stock.getSymbol(), new AsyncCallback<Long>() {
        public void onFailure(Throwable error) {
            handleError(error);
        }

        public void onSuccess(Long id) {
            stock.setId(id);
            displayStock(stock.getSymbol());
        }
    });
}

Modify the StockServiceImpl Class to Return StockClient[]

最后,我们修改了储存服务电离层舱法,以便把服务器-侧储存级转换为客户-总部储存板级,然后返回阵列。

StockServiceImpl.java

import com.google.gwt.sample.stockwatcher.client.StockClient;

我们需要稍微改变添加识别器的方法,以便把生成的识别器退回:

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

所有其他方法保持不变,除非有:

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

Summary

以上准则在部署到谷歌应用引擎时对我非常有用,但引发谷歌网络工具箱中的错误:

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

让我知道你是否遇到同样的问题。 该公司在谷歌应用发动机工作的事实似乎表明,主宰模式是一种泡沫。

问题回答

GWT需要除class子外的档案。 此外,库存必须位于地球静止轨道模块的“客户”地点。

GWT的汇编者不了解库存,因为库存不在其所研究的地点。 您可以将其带给客户的夹子,或者如果它更有意义地离开客户,并创建模块Name。 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>

I was getting the same issue and the "mvn gwt:compile" output was not very helpful. Instead, when I tried deploying to tomcat (via the maven tomcat plugin: mvn tomcat:deploy) I got helpful error messages.

我必须做几件事:

  1. Make the object that is sent from the client to the server implement Serializable
  2. Add an empty-arg constructor to that same object

是的,我们确信,我们需要利用Serialization将服务器物体带给客户。 这些 mo? 档案馆舍在客户使用股票类别方面赢得了一定的工作。

在你的情况下,只有一类股票,你可以在客户方面制造一种股票。 它很容易。 但是,如果有更多班级的人,解决办法是什么。 如同这一类的特性一样,还有一些其他类型的课程。

例:stock.getEOD(date);getHigh(;

<代码>getEOD> 将在规定日期后再交另一类,该类别有<代码>。 高方法。

在这样大的情况下,怎么办? 我不认为在客户方面设立所有实施序列化的班级是好的。 然后,我们必须在服务器和客户中书写代码。 两班制。

以上“rus”的答案......

在我的案件中,我需要编辑单元。 gwt.xml文档并添加如下内容:

<source path= client />
<source path= shared />

我以New->Web Application Project, wizard, but unchecked the Generate Project samples代码. 我随后制定了共同一揽子计划。 如果我不听说过,这套材料本来是为我制作的,而Xml文件则根据上述内容修改。

这方面的解决办法非常简单和容易。 如果你想把你设计的门槛值从服务器一侧送到客户一边,那么你应在<>共享的包裹中确定这一门槛值。

例如,就你而言,你必须携带储存。 java 班级(rag和 drop)

com.google.gwt.sample.stockwatcher. Commond

一揽子计划。 然而,从你的一揽子等级来看,你似乎删除了这一共有的一揽子方案。 只是重新计算这一一揽子计划,并减少库存。 java在其中,让游戏开始。





相关问题
热门标签