2014-07-24 63 views
0

正如標題所說,我正在嘗試使用Objectify創建GAE + GWT項目,但我甚至無法將其解開。我確信我錯過了一些簡單的東西,但似乎並沒有工作。GAE + GWT +物化工作

以下是我迄今所做的:

  • 創建一個新項目,並添加guava-17.0.jarguava-gwt-17.0.jarobjectify-5.0.3.jarobjectify-gwt-1.1jarWEB-INF\lib文件夾。這些都是這些罐子的最新版本。
  • 運行該應用程序。發送一個簡單的RPC命令,服務器響應,並且客戶端成功接收響應(調用onSuccess())。
  • 將行<inherits name="com.googlecode.objectify.Objectify" />添加到我的gwt.xml文件中,根據Objectify-GWT's website這應該啓用GWT中的Objectify。
  • 運行該應用程序。應用程序啓動,發送相同的RPC命令,服務器接收並響應,但客戶端說該命令失敗(調用onFailure())。

我正在使用首次創建新的Web應用程序時預填充的樣板代碼。作爲參考,這裏是RPC命令:

private void sendNameToServer() { 
    // First, we validate the input. 
    errorLabel.setText(""); 
    String textToServer = nameField.getText(); 
    if (!FieldVerifier.isValidName(textToServer)) { 
     errorLabel.setText("Please enter at least four characters"); 
     return; 
    } 

    // Then, we send the input to the server. 
    sendButton.setEnabled(false); 
    textToServerLabel.setText(textToServer); 
    serverResponseLabel.setText(""); 
    greetingService.greetServer(textToServer, 
      new AsyncCallback<String>() { 
       public void onFailure(Throwable caught) { 
        // Show the RPC error message to the user 
        dialogBox 
          .setText("Remote Procedure Call - Failure"); 
        serverResponseLabel 
          .addStyleName("serverResponseLabelError"); 
        serverResponseLabel.setHTML(SERVER_ERROR); 
        dialogBox.center(); 
        closeButton.setFocus(true); 
       } 

       public void onSuccess(String result) { 
        dialogBox.setText("Remote Procedure Call"); 
        serverResponseLabel 
          .removeStyleName("serverResponseLabelError"); 
        serverResponseLabel.setHTML(result); 
        dialogBox.center(); 
        closeButton.setFocus(true); 
       } 
      }); 
} 

這是我收到後我儘量讓RPC調用錯誤:

[DEBUG] [my_app] - Validating units: 
[INFO] [my_app] - Module my_app has been loaded 
[ERROR] [my_app] - Errors in 'com/google/gwt/dev/jjs/SourceOrigin.java' 
    [ERROR] [my_app] - Line 77: The method synchronizedMap(new LinkedHashMap<SourceOrigin,SourceOrigin>(){}) is undefined for the type Collections 
[ERROR] [my_app] - Errors in 'com/google/gwt/dev/util/StringInterner.java' 
    [ERROR] [my_app] - Line 29: No source code is available for type com.google.gwt.thirdparty.guava.common.collect.Interner<E>; did you forget to inherit a required module? 
    [ERROR] [my_app] - Line 29: No source code is available for type com.google.gwt.thirdparty.guava.common.collect.Interners; did you forget to inherit a required module? 

對我來說,它看起來像物化與GWT干擾。我知道他們應該一起工作,所以不知道我做錯了什麼。任何意見,將不勝感激。

回答

0

使用物化-GWT 1.2。有可能1.1有一些合併不良公關的問題。

你可以看到,採用物化,GWT傳遞一個GeoPt從客戶這裏來回一個示例應用程序:https://github.com/stickfigure/objectify-gwt-test

+0

我發現1.2是在幾天前提交的。根據更改日誌,它看起來應該解決編譯問題。當我今晚回家時,我會嘗試,如果有效,請給出答案。謝謝。 – awudoin

0

在嘗試做這種事情之前,你應該在服務器端使用objectify。 Objectify是服務器端的生存技術。在您的服務器代碼中調用它

如果您在GWT上收到onFailure()(這意味着服務器端出現故障),請在您的服務方法中添加try catch並在服務器控制檯上打印異常的堆棧跟蹤。你必須找到失敗的原因。

現在第二個部分是一個建議:

<inherits name="com.googlecode.objectify.Objectify" /> 

對我來說是weired線。 GWT不必知道你的持久層。

除非它是一個革命性的概念,我建議你闖到大使用這種技術的,從你的數據庫訪問的CONTROLE刪除你的手......

+0

我明白這一點,但物化-GWT是除了客觀化,讓你通過你的實體對象通過GWT,以防止創建一個全新的數據傳輸層,在我的情況下是過度殺傷。 – awudoin

+0

服務器代碼沒有失敗。就像我說的,它可以工作,直到我添加繼承線。我已經通過了服務器代碼,它按預期工作。 – awudoin

+0

我建議你在你的onFailure()方法中放置一個斷點,看看是誰在調用它以及爲什麼。這個錯誤會更加清晰 p.s:我剛剛看到你的問題已經解決了,所以不要理會這個評論,但是在下一次你會被卡住的時候使用它:) –