【问题标题】:Call JSNI Java function from javascript via a frame in GWT - $wnd is undefined error通过 GWT 中的框架从 javascript 调用 JSNI Java 函数 - $wnd 是未定义的错误
【发布时间】:2016-07-15 14:29:35
【问题描述】:

我知道我可能只是在做一些愚蠢的事情,但我找不到一个实际展示如何使用 GWT 从 javascript 调用 Java 方法的示例。

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

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) {
      that.@mypackage.Account::add(I)(amt);
    });
}-*/;
}

然后你可以在JS中调用它使用

$wnd.add(5);

但这会导致我出现“$wnd 未定义”的错误。

这是我的代码: 我导出函数调用

public native void exportPaymentProcessComplete()/*-{
    var that = this;
    console.log('exportingPaymentProcessComplete');
    $wnd.paymentProcessComplete = $entry(function(result){
        that.@com.ec.client.checkout.Presenter::paymentProcessComplete(Ljava/lang/String;)(result);
    });

}-*/;

我有一个正在调用的简单函数(有一个断点,因为我还没有调用它)

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

    }
}

这是棘手的部分,可能是我出错的地方。 JSNI 调用是在加载时从 iframe 进行的。我认为这与尝试调用父窗口的 javascript 函数有关,但我不确定如何引用父窗口的 $wnd 对象。

我试过这个:

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

当我收到“$wnd is undefined”错误时。

还有这个:

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

这给了我“无法获取未定义或空引用的属性 'paymentProcessComplete'”。这与“$wnd is undefined”基本相同。

有人对如何做到这一点有任何想法吗?

【问题讨论】:

    标签: javascript java gwt jsni


    【解决方案1】:

    在编译您的 GWT 应用程序时,$wndwindow 替换。 因此,当您尝试从 iframe 内部调用导出的方法时,请像这样调用它:
    window.parent.paymentProcessComplete("SUCCESS")

    【讨论】:

    • 这似乎确实改变了一些事情。我收到一个稍微不同的错误“对象不支持属性或方法‘paymentProcessComplete’”。听起来我现在至少正确地引用了“$wnd”。谢谢你。 :)
    【解决方案2】:

    经过深入研究,我发现导出/公开我的 JAVA 方法的 JSNI 代码引发了 Cast 异常,因为它试图将其附加到 Presenter 类,它是它的一部分,而不是 Window。

    所以这段代码:

    public native void exportPaymentProcessComplete()/*-{
        var that = this;
        console.log('exportingPaymentProcessComplete');
        $wnd.paymentProcessComplete = $entry(function(result){
            that.@com.ec.client.checkout.Presenter::paymentProcessComplete(Ljava/lang/String;)(result);
        });
    }-*/;
    

    变成了这个代码:

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

    这也意味着 paymentProcessComplete() 方法必须有一个静态修饰符应用于它的声明。

    private static void paymentProcessComplete(String result){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多