UnsatisfiedLinkError с использованием JSNI с vaadin

Я создал проект Vaadin и использовал JSNI для сценариев. Но когда выполнение достигает в сценарии JSNI, это показывает ошибку.

java.lang.UnsatisfiedLinkError: com.yty.cws.CiwsUI.jsniDemo()V
    at com.yty.cws.CiwsUI.jsniDemo(Native Method) ~[classes/:na]
    at com.yty.cws.CiwsUI.lambda$0(CwsUI.java:31) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_92]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_92]

Ниже приведен мой пример кода.

public class CiwsUI extends UI{

    private static final long serialVersionUID = 5275145103992848572L;
    VerticalLayout mainLayout=new VerticalLayout();
    private TextField txtName=new TextField();
    private Button btnJSNI=new Button("JSNI");
    @Override
    protected void init(VaadinRequest request) {

        mainLayout.addComponents(txtName,btnJSNI);
        setContent(mainLayout);
        mainLayout.setComponentAlignment(txtName, Alignment.MIDDLE_CENTER);
        mainLayout.setComponentAlignment(btnJSNI, Alignment.MIDDLE_CENTER);
        btnJSNI.addClickListener(e->{
            System.out.println("Clicked");
            jsniDemo();
        });
    }
    private native void jsniDemo()/*-{
    $wnd.alert("Hai JSNI");
    }-*/;

}

Любая помощь с благодарностью.

1 ответ

Решение

Если вы посмотрите на различия между GWT и Vaadin, вы заметите, что помимо API на стороне клиента, Vaadin также имеет API на стороне сервера, и код, который вы разместили, попадает в эту категорию. В поисках на форуме Вадина я нашел этот вопрос именно с вашей проблемой. Добавим ниже ответ Генри Сары из команды разработчиков Vaadin:

JSNI можно использовать только в виджетах на стороне клиента, тогда как вы работаете на стороне сервера.

Используйте Window.executeJavaScript("...") (Vaadin 6) или Root.executeJavaScript("...") (Vaadin 7), если вам нужно выполнить JavaScript из приложения на стороне сервера.

Хотя с момента ответа и Root.executeJavaScript("..."); сейчас наверное JavaScript.getCurrent().execute(...)");Документы Vaadin предоставляют информацию о взаимодействии javascript с сервером и с серверной части, а также о компонентах и ​​расширениях js, а также вы можете просмотреть вики для получения дополнительных примеров.

Другие вопросы по тегам