2016-07-15 13 views
0

私はおそらく何かばかげたことを知っていますが、GWTを使用してJavaメソッドからJavaメソッドを呼び出す方法を実際に示す例は見つかりません。

package mypackage; 

public class Account { 
private int balance = 0; 
public int add(int amt) { 
    balance += amt; 
} 

public native void exportAdd() /*-{ 
    var that = this; 
    $wnd.add = $entry(function(amt) { 
     [email protected]::add(I)(amt); 
    }); 
}-*/; 
} 

I've followed the documentation almost verbatim where is says:

は、その後、あなたは

$wnd.add(5); 

を使用してJSでそれを呼び出すことができますしかし、それは "$のWNDが未定義である" と言う私のためにエラーが発生します。

これは私のコードです: 私は(私はそれが呼ばれるように取得するにはまだきているため、ブレークポイントで)私は呼ばれていますシンプルな機能を持つ関数呼び出し

public native void exportPaymentProcessComplete()/*-{ 
    var that = this; 
    console.log('exportingPaymentProcessComplete'); 
    $wnd.paymentProcessComplete = $entry(function(result){ 
     [email protected]::paymentProcessComplete(Ljava/lang/String;)(result); 
    }); 

}-*/; 

をエクスポート

public void paymentProcessComplete(String result){ 
    if(result != null){ 

    } 
} 

これは難しい部分ですが、おそらく私が間違っているところです。 iframeがロードされるとJSNI呼び出しが行われます。私は親ウィンドウのjavascript関数を呼び出すことと関係があると思いますが、親$ wndオブジェクトを参照する方法がわかりません。

私はこれを試してみた:私は "$のWNDが定義されていません" というエラーを取得するとき

response.getWriter().print("<script type=\"text/javascript\">parent.$wnd.paymentProcessComplete(\"SUCCESS\");</script>"); 

はどれ。

そしてまた、この:

response.getWriter().print("<script type=\"text/javascript\">parent.paymentProcessComplete(\"SUCCESS\");</script>"); 

私に「未定義またはnull参照のプロパティを取得できません 『paymentProcessComplete』」を与えます。これは基本的に "$ wnd is undefined"と同じエラーです。

誰でもこれを達成するための考えがありますか?

答えて

1

をいくつかのより深く掘削した後、私はJAVAの方法を暴露/エクスポートたJSNIコードがキャストを投げていたことを発見しました例外はPresenterクラスに添付しようとしていたため、ウィンドウの代わりにその一部になっていました。

ので、このコード:

public native void exportPaymentProcessComplete()/*-{ 
    var that = this; 
    console.log('exportingPaymentProcessComplete'); 
    $wnd.paymentProcessComplete = $entry(function(result){ 
     [email protected]::paymentProcessComplete(Ljava/lang/String;)(result); 
    }); 
}-*/; 

このコードになったが:またpaymentProcessComplete()メソッドを意味

public native void exportPaymentProcessComplete()/*-{ 
    $wnd.paymentProcessComplete = $entry(function(result){ 
     @com.ra.ec.client.checkout.CheckoutPresenter::paymentProcessComplete(Ljava/lang/String;)(result); 
    });  
}-*/; 

はそれの宣言に適用される静的な修飾子を持つ必要がありました。

private static void paymentProcessComplete(String result){ 
+0

なぜこれが投票されたのですか?それは正解です。 – Miniversal

0

GWT Appをコンパイルすると、$wndwindowに置き換えられます。 だからあなたはこのようにそれを呼び出すのiframe内からエクスポートされたメソッドを呼び出すようにしようとしているとき:
window.parent.paymentProcessComplete("SUCCESS")

+0

これは変更されたようです。私は少し異なるエラーが発生しています "オブジェクトは、プロパティまたはメソッド 'paymentProcessComplete'をサポートしていません。私は "$ wnd"を正しく参照しているようです。ありがとうございました。:) – Miniversal

関連する問題