Как решить проблему с JSNI в GWT?

Есть 2 модуля: GWT и Java(Spring);
Project
--GWT
--Java

Пытаюсь вызвать метод из java модуля:
public class MyClass extends Composite{

    @UiField
    TextBox text;

    @UiField
    Button btn;

    interface EmailMailingUiBinder extends UiBinder<HTMLPanel, MyClass> {
    }

    private static MyClassUiBinder myUiBinder = GWT.create(MyClassUiBinder.class);

    public MyClass() {
        HTMLPanel rootElement = ourUiBinder.createAndBindUi(this);
        initWidget(rootElement);
        
        /* do smth and @return param. Login, for example */
       
        /* Вешаю обработчик на кнопку btn*/
        btn.addClickHandler( (event) -> {
        /* вот здесь мне нужно вызвать метод, при нажатие на эту самую кнопку, из модуля Java
           но так, как в GWT(JS) нельзя это сделать использую JSNI метод(собственно не уверен, что правильно его использую)
        */

         sendOnClick(login); //native метод описан ниже
        });
    }

/*
в таком виде этот native метод при сборки Gradle выдает Missing qualifier on instance method на строке N1
*/
     public native void sendOnClick(String login) /*-{
      /*строка N*/  @ru.my.java.packet.proj.SendingService::sendIt(Ljava/lang/String;)(login);
    }-*/;
}

Как-нибудь можно это дело заставить работать? то есть вызвать тот самый метод в GWT из java модуля
  • Вопрос задан
  • 2591 просмотр
Пригласить эксперта
Ответы на вопрос 1
@mv200580
JSNI в том виде, в котором вы его хотите использовать, предназначен для вызова из Javascript некоторого статического метода из Java, причем на стороне клиента, т.е. части приложения GWT. Это делается с помощью мэппинга java-метода на javascript-функцию, например так:
public static native void prepareJSNI() /*-{
var frame = $wnd.frames["sliderFrame"];
frame.contentWindow.refreshTest = @com.mmk.sniper.client.FirstPanel::refreshTest(Ljava/lang/String;Ljava/lang/String;);
}-*/;
Метод prepareJSNI() вызывается при инициализации GWT-приложения.

Т.е. сначала нужно замэппить статический java-метод на javascript-функцию, а потом вызывать его из браузерного javascript. Еще раз повторю, что речь здесь идет о коде на стороне клиента (GWT).

В вашем случае, насколько я понял, необходимо чтобы по нажатию кнопки исполнился серверный код (spring и т.д.). Здесь самым простым способом будет вызов через GWT-RPC.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы