2011-06-28 26 views
1

JSNIを使用してGWTのWebSocket用の単純なバインディングを作成しようとしていますが、JSNIメソッドが呼び出されるたびに例外が発生し続けます。単純化されたクラス定義は、休閑の通りです:
JavaScriptをJSNIで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ワーカーのために同様のバインディングを作成しようとしましたが、まったく同じエラーが発生していましたので、 eのバインディングと私はこの例外の理由を見つけることができるまで簡単に何かを試してください。

答えて

0

は、他の人がそれを実装しているかを見てみましょう:http://code.google.com/p/gwt-comet/source/browse/trunk/src/net/zschech/gwt/websockets/client/WebSocket.java

たぶんあなただけgwt-comet's websocketsを使うだろうか?

+0

目標が欠けているがWebSocketを実装の作業を取得するために、私はこのエラーを取得しています理由を理解することではありません。私の実装と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つを逃していたこと単にでした。

1

あなたは私のための$ WND接頭辞に

return new $wnd.WebSocket(url); 
関連する問題