2016-07-15 7 views
0

Я знаю, что я, вероятно, просто делаю что-то глупое, но я не могу найти пример, который на самом деле показывает, как вызвать метод Java из javascript с помощью GWT.

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) { 
     [email protected]::add(I)(amt); 
    }); 
}-*/; 
} 

Тогда вы можете вызвать его в JS с помощью

$wnd.add(5); 

Но это приводит к ошибке для меня, что говорит "$ 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){ 

    } 
} 

Это сложная часть, и, вероятно, я ошибаюсь. Вызов JSNI производится из iframe, когда он загружается. Я думаю, что это связано с попыткой вызвать javascript-функции родительского окна, но я не уверен, как обращаться к объекту $ wnd.

Я попытался это:

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

Который, когда я получаю "$ WND не определен" ошибка.

А также это:

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

Что дает мне «Невозможно получить свойство„paymentProcessComplete“неопределенной или нулевой ссылки». Это, по сути, та же ошибка, что и «$ wnd undefined».

У кого-нибудь есть мысли о том, как это сделать?

ответ

1

После некоторого глубокого копания, я обнаружил, что код JSNI, который экспортировал/обнажая мой метод JAVA бросал Cast исключение, потому что он пытался прикрепить его к классу Presenter, он был частью вместо Window.

Так этот код:

public native void exportPaymentProcessComplete()/*-{ 
    var that = this; 
    console.log('exportingPaymentProcessComplete'); 
    $wnd.paymentProcessComplete = $entry(function(result){ 
     [email protected]::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){ 
+0

Почему это проголосовали? Это правильный ответ. – Miniversal

0

при компиляции вашего приложения GWT $wnd заменяется на window. Так что, когда вы пытаетесь вызвать экспортированной метод из внутри фрейма называют это так:
window.parent.paymentProcessComplete("SUCCESS")

+0

Это, казалось, изменило ситуацию. Я получаю немного другую ошибку «Объект не поддерживает свойство или метод« paymentProcessComplete ». Похоже, что я сейчас ссылаюсь на «$ wnd» правильно, по крайней мере. Спасибо.:) – Miniversal