2011-06-28 116 views
1

我想爲使用JSNI的GWT創建WebSockets的簡單綁定,但每次調用JSNI方法時都會收到異常。簡化的類定義是休耕:
與JSNI整合GWT到GWT的問題

public class Socket extends JavaScriptObject{ 
    protected Socket() {} 

    public static native Socket connect(String url) /*-{ 
     return new WebSocket(url); 
    }-*/; 
} 

在試圖實例化一個Socket對象,使用線路:

Socket socket = Socket.connect("http://www.google.com"); 

我得到的休耕例外,我不知道爲什麼:

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396) 
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:193) 
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510) 
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.ClassFormatError: Illegal method name "$" in class edu/catalindumitru/gwt/socket/Socket 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:465) 
    at com.google.gwt.dev.shell.CompilingClassLoader.findClass(CompilingClassLoader.java:1078) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at edu.catalindumitru.gwt.steel.client.GameCore.onModuleLoad(GameCore.java:32) 
    ... 9 more 

我已經嘗試過以前爲類型化數組和web工作者創建一個類似的綁定,但我得到了完全相同的錯誤,所以我決定暫停開發thos e綁定並嘗試更簡單的操作,直到找到導致此異常的原因。

回答

0
+0

目標對我來說是無法得到的WebSockets的工作實現的,但要弄清楚爲什麼我收到此錯誤。我的實現和gwt-comet幾乎完全相同,但他顯然沒有得到這個例外。如果我不明白原因,我肯定會再次遇到這個問題。 –

+0

我試過你的代碼,我沒有得到錯誤。實際上,如果我用真正的websocket服務器嘗試它,Socket Socket = Socket.connect(「ws://echo.websocket.org」)' –

+0

這是意想不到的。我使用NetBeans的GWT4NB插件,該插件旨在與2.0以上版本的sdk配合使用,但它目前使用的是2.3 sdk。你介意告訴我你正在使用哪個IDE以及SDK的哪個版本? –

0

只是一個猜測,但據我所見,疊加使用,而不是JSON類型的數據。在這裏,您嘗試執行瀏覽器API對象的封送處理。我不確定它是否會以這種方式工作。特別是JSNI對傳遞的類型有限制。

也許你可以嘗試將WebSocket作爲本地部分的字段存儲,並將方法委託給該字段。但這只是一個盲目的猜測。

1

當我非常習慣地使用JavaScriptObject時,我從GWT得到了同樣的錯誤報告。

我的問題是僅僅是所有 JSO方法必須聲明最終,我已經錯過了一個。

1

你缺少$ WND前綴

return new $wnd.WebSocket(url);